R의 비선형 혼합 효과 회귀


14

놀랍게도 Google을 사용하여 다음 질문에 대한 답변을 찾을 수 없었습니다.

나는 시간에 대략 시그 모이 드 성장 행동을 보여주는 여러 개인의 생물학적 데이터를 가지고 있습니다. 따라서 표준 물류 성장을 사용하여 모델링하고 싶습니다.

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

p = 0은 t = 0에서의 시작 값이고, k는 t-> 무한에서의 점근 한 한계이고 r은 성장 속도이다. 내가 볼 수있는 한, 나는 nls를 사용하여 이것을 쉽게 모델링 할 수 있습니다 (내 이해가 부족합니다 : 왜 시간과 데이터를 스케일링하여 표준 로짓 회귀를 사용하여 비슷한 것을 모델링 할 수 없습니까? 비율, 그러나 드물게 http://www.stata-journal.com/article.html?article=st0147 이 탄젠트에 대한 다음 질문은 모델이 이상치> 1)를 처리 할 수 ​​있는지 여부입니다.

이제 세 가지 매개 변수 k, p0 및 r에 고정 (주로 범주 형) 및 임의의 (개인 ID 및 연구 ID) 효과를 허용하고 싶습니다. nlme가 이것을 수행하는 가장 좋은 방법입니까? 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))

비선형 혼합 모델, 특히 비선형 모델에 익숙하지 않기 때문에 초보자 질문이있는 자습서 / FAQ 링크 또는 권장 사항을 읽어보십시오.


2
k를 알려진 것으로 간주하면 모집단을 P / k로 확장 할 수 있습니다. k가 추정되어야하는 것이라면, 문제는 표준 로짓 회귀가 아님을 의미합니다.
Nick Cox

1
고마워 Nick. 예, 결국 k를 추정하고 회귀에 포함시켜야한다고 생각합니다. 로짓 회귀 사용에 대한 나의 관심은 순전히 학문적이었습니다. 비선형 모델링을 시작하기 전에이 모델이 좋은 모델이라고 생각했지만 Google을 사용하여 이진이 아닌 데이터에 대한 로짓 회귀에 대한 예제를 찾을 수 없었습니다. 연속 데이터가있는 로짓 링크와 함께 glmer를 사용하는 것이 좋지 않은 이유 (예 : 오류에 대한 분포 가정)가 있는지 궁금합니다.
Rob Hall

3
지속적인 비율의 반응에 대한 로짓 모델링은 오랫동안 사용되어 왔지만 잘 알려져 있지 않은 것 같습니다. stata-journal.com/sjpdf.html?articlenum=st0147의 Baum을 참조하십시오. 그럼에도 불구하고 귀하의 상황이 아닙니다. R 구현에 대해서는 언급 할 수 없습니다.
Nick Cox

이 흥미로운 링크에 대해 Nick에게 감사의 말을 전합니다. 안타깝게도 아직 귀하의 답변을지지 할 수없는 것 같습니다. (사람들이 직접 링크에 액세스하는 데 문제가있는 경우, 다음은 나를 위해 일했습니다 : stata-journal.com/article.html?article=st0147 )
Rob Hall

1
로지스틱 성장은 단조로운 상승 곡선을 의미합니다. 데이터가 일치하지 않으면 정확히 수행중인 작업에 따라 적합하지 않거나 소프트웨어가 재생되지 않습니다.
Nick Cox

답변:


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
)

그런 다음 업데이트를 사용하여 모델 복잡성을 높입니다. 시작 매개 변수는 작업하기가 약간 까다로워서 순서를 파악하는 데 약간의 시간이 걸릴 수 있습니다. Asym에 대한 var1의 새로운 고정 효과가 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는 내 데이터 세트의 특이 치에 대해 더 견고 해 보였고 더 복잡한 모델에 대해보다 안정적인 수렴을 제공하는 것으로 보였습니다. 그러나 단점은 관련 가능성 함수를 수동으로 지정해야한다는 것입니다. 다음은 Asym에 대한 var1 (이진)의 고정 효과를 가진 로지스틱 성장 모델입니다. 비슷한 방식으로 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
귀하의 게시물에 대해 Rob에게 감사드립니다. 실제로 내 데이터와 관련이 있습니다. Asym의 nestedModel에서 var1이 무엇이며 어떻게 계산했는지 이해하지 못합니까?

다음은 Asym에 일부 변수의 영향을 포함시키는 방법에 대한 예일뿐입니다. "다음은 Asym에 대한 var1 (이진)의 고정 효과를 가진 로지스틱 성장 모델입니다." 예를 들어, 값이 0과 1 인 변수 "Treated"가 있으므로 "var1"대신 "Treated"를 사용하십시오.
PA6OTA
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.