Нелінійна регресія змішаних ефектів в R


14

Дивно, але мені не вдалося знайти відповідь на таке запитання за допомогою Google:

У мене є деякі біологічні дані від кількох людей, які показують приблизно сигмоподібну поведінку росту в часі. Таким чином, я хочу моделювати його за допомогою стандартного логістичного зростання

P(t) = k*p0*exp(r*t) / (k+p0*(exp(r*t)-1))

при цьому p0 є початковим значенням при t = 0, k - асимптотична межа при t-> нескінченності, а r - швидкість росту. Наскільки я бачу, я можу легко моделювати це за допомогою nls (відсутність розуміння з мого боку: чому я не можу моделювати щось подібне, використовуючи стандартну регресію logit шляхом масштабування часу та даних? EDIT: Дякую Ніку, мабуть, люди це роблять, наприклад, для пропорції, але рідко http://www.stata-journal.com/article.html?article=st0147 . Наступним питанням щодо цієї дотичної буде таке, чи модель може обробляти люди, що переживають інші люди> 1).

Тепер я хочу дозволити деякий фіксований (в основному категоричний) і якийсь випадковий (індивідуальний ідентифікатор, а можливо і ідентифікаційний номер дослідження) на три параметри k, p0 і r. Чи найкращий спосіб зробити це? Модель SSlogis здається розумною для того, що я намагаюся зробити, це правильно? Чи є якась із наступних розумних моделей для початку? Я не можу здатись, що правильні початкові значення правильні, а оновлення () тільки, здається, працює на випадкові ефекти, а не на фіксовані - будь-які підказки?

nlme(y ~ k*p0*exp(r*t) / (k+p0*(exp(r*t)-1)), ## not working at all (bad numerical properties?)
            data = data,
            fixed = k + p0 + r ~ var1 + var2,
            random = k + p0 + r ~ 1|UID,
            start = c(p0=1, k=100, r=1))

nlme(y ~ SSlogis(t, Asym, xmid, scal), ## not working, as start= is inappropriate
            data = data,
            fixed = Asym + xmid + scal ~ var1 + var2, ## works fine with ~ 1
            random = Asym + xmid + scal ~ 1|UID,
            start = getInitial(y ~ SSlogis(Dauer, Asym, xmid, scal), data = data))

Оскільки я новачок у нелінійних змішаних моделях, зокрема, і нелінійних моделях взагалі, я буду вдячний за деякими рекомендаціями щодо читання або посиланнями на підручники / FAQ, які мають запитання для новачків.


2
Якщо ви вважаєте k відомим, ви можете масштабувати кількість населення за P / k. Якщо k - це щось, що слід оцінити, то одне лише означає, що ваша проблема не є стандартною регресією logit.
Нік Кокс

1
Дякую, Нік. Так, врешті-решт, я вважаю, що k потрібно оцінити та включити до регресії. Мій інтерес до використання логіт регресії був суто академічним. Я подумав, що це може бути хороша модель для початку, перш ніж перейти до нелінійного моделювання, але мені не вдалося знайти жодних прикладів для регресії logit для небінарних даних за допомогою Google. Мені було цікаво, чи є якась причина (наприклад, припущення щодо розповсюдження помилок), які роблять поганою ідеєю, наприклад, glmer з посиланням logit з постійними даними.
Роб Холл

3
Моделювання Logit для відповідей, які мають постійні пропорції, існує вже деякий час, але, здається, недостатньо відоме. Дивіться, наприклад, Баум в stata-journal.com/sjpdf.html?articlenum=st0147 Тим не менш, це не ваша ситуація. Я не можу коментувати реалізацію R.
Нік Кокс

Дякую Ніку за це цікаве посилання - це прояснює для мене кілька речей. На жаль, здається, я ще не можу підтримати вашу відповідь. (Якщо у людей виникають проблеми з прямим посиланням, для мене працювало наступне: stata-journal.com/article.html?article=st0147 )
Rob Hall

1
Логістичне зростання передбачає монотонну криву зростання. Якщо дані не збігаються, ви отримаєте погану форму або програмне забезпечення не буде відтворюватися, залежно від того, що ви робите.
Нік Кокс

Відповіді:


12

Мені хотілося поділитися деякими речами, про які я дізнався після того, як задав це питання. nlme представляється розумним способом моделювання нелінійних змішаних ефектів у Р. Почніть з простої базової моделі:

library(nlme)
data <- groupedData(y ~ t | UID, data=data) ## not strictly necessary
initVals <- getInitial(y ~ SSlogis(t, Asym, xmid, scal), data = data)
baseModel<- nlme(y ~ SSlogis(t, Asym, xmid, scal),
    data = data,
    fixed = list(Asym ~ 1, xmid ~ 1, scal ~ 1),
    random = Asym + xmid + scal ~ 1|UID,
    start = initVals
)

Потім використовуйте оновлення для збільшення складності моделі. Параметр "Пуск" для роботи трохи складний, для розробки порядку може знадобитися певний розмитнення. Зверніть увагу, як новий фіксований ефект для var1 на Asym слідує за регулярним фіксованим ефектом для Asym.

 nestedModel <- update(baseModel, fixed=list(Asym ~ var1, xmid ~ 1, scal ~ 1), start = c(fixef(baseModel)[1], 0, fixef(baseModel)[2], fixef(baseModel)[3]))

lme4 видався більш надійним щодо людей, що перебувають у моєму наборі даних, і, здається, пропонував більш надійне зближення для більш складних моделей. Однак, як здається, недоліком є ​​те, що відповідні функції ймовірності потрібно визначати вручну. Далі наведена логістична модель зростання з фіксованим впливом var1 (бінарний) на Asym. Ви можете додати фіксований вплив на xmid та масштабування аналогічним чином. Зверніть увагу на дивний спосіб визначення моделі, використовуючи подвійну формулу як результат ~ фіксовані ефекти ~ випадкові ефекти.

library(lme4) ## careful loading nlme and lme4 concurrently
customLogitModel <- function(t, Asym, AsymVar1, xmid, scal) {
    (Asym+AsymVar1*var1)/(1+exp((xmid-t)/scal))
}

customLogitModelGradient <- deriv(
    body(customLogitModel)[[2]], 
    namevec = c("Asym", "AsymVar1", "xmid", "scal"), 
    function.arg=customLogitModel
)

## find starting parameters
initVals <- getInitial(y ~ SSlogis(t, Asym, xmid, scal), data = data)

# Fit the model
model <- nlmer(
    y ~ customLogitModelGradient(t=t, Asym, AsymVar1, xmid, scal, var1=var) ~ 
    # Random effects with a second ~
    (Asym | UID) + (xmid | UID) + (scal | UID), 
    data = data, 
    start = c(Asym=initVals[1], AsymVar1=0, xmid=initVals[2], scal=initVals[3])
)

1
Дякую Роб за вашу посаду, це насправді саме те, що я намагаюся зробити зі своїми даними. Я не розумію, що таке var1 у вкладеному модулі на Asym і як ви це обчислили?

Це лише приклад того, як включити вплив деякої змінної на Asym: "Далі йде логістична модель зростання з фіксованим ефектом var1 (бінарний) на Asym." Наприклад, у вас є змінна "Оброблено", яка має два значення 0 і 1, тому замініть "Оброблено" на "var1".
PA6OTA
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.