Нелинейная смешанная регрессия эффектов в R


14

Удивительно, но я не смог найти ответ на следующий вопрос с помощью Google:

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

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

где p0 является начальным значением при t = 0, k является асимптотическим пределом при t-> бесконечности и r является скоростью роста. Насколько я вижу, я могу легко смоделировать это с помощью nls (отсутствие понимания с моей стороны: почему я не могу смоделировать нечто подобное, используя стандартную регрессию logit путем масштабирования времени и данных? РЕДАКТИРОВАТЬ: Спасибо Ник, очевидно, люди делают это, например, для пропорции, но редко http://www.stata-journal.com/article.html?article=st0147 . Следующий вопрос по этой касательной будет, если модель может обрабатывать выбросы> 1).

Теперь я хочу разрешить некоторые фиксированные (в основном категориальные) и некоторые случайные (индивидуальный идентификатор и, возможно, также идентификатор исследования) воздействия на три параметра k, p0 и r. Это лучший способ сделать это? Модель SSlogis кажется разумной для того, что я пытаюсь сделать, верно? Любая из следующих разумных моделей для начала? Кажется, я не могу правильно понять начальные значения, а update (), похоже, работает только для случайных эффектов, а не для фиксированных - какие-нибудь подсказки?

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))

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


2
Если вы считаете k известным, вы можете масштабировать свои популяции на P / k. Если k - это то, что нужно оценить, это само по себе означает, что ваша проблема не является стандартной регрессией логита.
Ник Кокс

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

3
Моделирование логита для ответов, которые являются непрерывными пропорциями, было вокруг в течение некоторого времени, но, по-видимому, не очень хорошо известно. См. Например, Баум в stata-journal.com/sjpdf.html?articlenum=st0147 Тем не менее это не ваша ситуация. Я не могу комментировать R реализации.
Ник Кокс

Спасибо, Ник, за эту интересную ссылку, которая проясняет некоторые вещи для меня. К сожалению, похоже, я пока не могу поддержать ваш ответ. (Если у людей возникли проблемы с доступом к прямой ссылке, у меня сработало следующее: stata-journal.com/article.html?article=st0147 )
Роб Холл,

1
Логистический рост подразумевает монотонную кривую роста. Если данные не совпадают, вы получите плохое соответствие или программное обеспечение не будет играть, в зависимости от того, что вы делаете.
Ник Кокс

Ответы:


12

Я хотел поделиться некоторыми вещами, которые я узнал с тех пор, как задал этот вопрос. NLME кажется разумным способом моделирования нелинейных смешанных эффектов в R. Начнем с простой базовой модели:

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
)

Затем используйте обновление, чтобы увеличить сложность модели. С параметром start работать немного сложнее, для определения порядка может потребоваться некоторая обработка. Обратите внимание, что новый фиксированный эффект для 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]))

Ime4 казался более устойчивым к выбросам в моем наборе данных и, казалось, предлагал более надежную конвергенцию для более сложных моделей. Однако, похоже, недостатком является то, что соответствующие функции правдоподобия должны быть указаны вручную. Ниже приведена модель логистического роста с фиксированным эффектом var1 (бинарный) на Asym. Вы можете добавить фиксированные эффекты на xmid и scal аналогичным образом. Обратите внимание на странный способ задания модели с использованием двойной формулы в качестве результата ~ фиксированные эффекты ~ случайные эффекты.

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 в nestedModel на Asym и как вы его рассчитали?

Это всего лишь пример того, как включить влияние некоторой переменной на Asym: «Ниже приведена модель логистического роста с фиксированным влиянием var1 (двоичного) на Asym». Например, у вас есть переменная «Обработано», которая имеет два значения 0 и 1, поэтому замените «Обработано» на «var1».
PA6OTA
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.