반응 변수가 0에서 1 사이 인 혼합 모델을 맞추는 방법은 무엇입니까?


15

내가 사용하려고 lme4::glmer()바이너리 아닌 종속 변수지만, 0과 1 사이의 연속 변수와 이항 일반화 된 혼합 모델 (GLMM)를 맞게. 이 변수를 확률로 생각할 수 있습니다. 사실 그것은 이다 사람을 대상으로하여 (실험하는 I 도움말 분석에)보고 된 확률. 즉 그건 아니 는 "이산"분수하지만, 연속 변수입니다.

glmer()(아래 참조) 예상대로 호출이 작동하지 않습니다. 왜? 어떡해?

나중에 편집 : 아래 내 대답은이 질문의 원래 버전보다 더 일반적이므로 질문도 더 일반적으로 수정했습니다.


자세한 내용은

분명히 이진 DV뿐만 아니라 0과 1 사이의 연속 DV에도 로지스틱 회귀를 사용할 수 있습니다. 실제로 내가 달릴 때

glm(reportedProbability ~ a + b + c, myData, family="binomial")

경고 메시지가 나타납니다

Warning message:
In eval(expr, envir, enclos) : non-integer #successes in a binomial glm!

그러나 매우 합리적인 적합성 (모든 요소는 범주 적이므로 모델 예측이 전체 대상에 가까운 지 여부를 쉽게 확인할 수 있습니다).

그러나 실제로 사용하고 싶은 것은

glmer(reportedProbability ~ a + b + c + (1 | subject), myData, family="binomial")

그것은 나에게 동일한 경고를주고 모델을 반환하지만이 모델은 분명히 많이 벗어났습니다. 고정 효과의 추정치는 그 효과 glm()와 주제 간 평균과는 거리가 멀다 . (그리고 내가 포함해야 glmerControl(optimizer="bobyqa")glmer, 그렇지 않으면 전혀 수렴하지 않고, 호출.)


1
확률을 먼저 변환하는 것은 어떻습니까? 로짓 변환과 같이 정규 분포에 더 가까운 것을 얻을 수 있습니까? 아니면 arcsin-sqrt? 그것은 글머를 사용하는 것보다 내가 선호하는 것입니다. 또는 해킹 솔루션에서 가중치 선택으로 인한 분산 부족을 설명하기 위해 각 관측치에 임의의 효과를 추가 할 수도 있습니다.
Aaron은 Stack Overflow를 남겼습니다

감사. 예, DV를 기록한 다음 Gaussian 혼합 모델 (lmer)을 사용할 수 있지만 이것은 일종의 해킹이므로 권장하지 않는다는 것을 읽었습니다. 각 관측치에 대해 임의의 효과를 시도합니다! 현재 베타 혼합 모델을 사용하고 있습니다. lme4는 처리 할 수 ​​없지만 glmmadmb는 처리 할 수 ​​있습니다. 을 실행할 때 glmmadmb(reportedProbability ~ a + b + c + (1 | subject), myData, family="beta")올바른 맞춤과 합리적인 신뢰 구간을 얻지 만 수렴에 실패했습니다. 경고 :-/ 반복 횟수를 늘리는 방법을 찾으려고합니다. DV = 0 또는 DV = 1 사례가 없기 때문에 베타가 나에게 도움이 될 수 있습니다.
amoeba는 Reinstate Monica

나는 glmer에 대해 모른다. 그러나 glm에 대해서는 이것이 도움이 될 수있다 : stats.stackexchange.com/questions/164120/… :

1
@Aaron : + (1 | rowid)글램 머 통화에 추가하려고했는데 , 체중 선택과 무관하게 안정적인 추정치와 안정적인 신뢰 구간을 얻었습니다 (100과 500을 시도했습니다). 나는 또한 logit (reportedProbability)에서 lmer를 실행하려고 시도했으며 거의 ​​똑같은 것을 얻습니다. 따라서 두 솔루션 모두 잘 작동하는 것 같습니다! glmmadmb가 포함 된 Beta MM도 매우 근접한 결과를 제공하지만 어떤 이유로 든 완전히 수렴하지 않고 계속 실행되는 데 시간이 걸립니다. 이러한 옵션을 나열하고 차이점과 장단점을 설명하는 답변을 게시하십시오! (내가 언급 한 신뢰 구간은 모두 Wald입니다.)
amoeba는 Reinstate Monica가

1
그리고 그들은 0.9와 같은 그들의 가치에 대해 절대적으로 확신합니까, 아니면``오류 마진 ''이 있습니까? 다른 주제에 의해보고 된 신뢰도가 똑같이 정확하다고 가정 할 수 있습니까?

답변:


21

무작위 효과가없는 간단한 경우로 시작하는 것이 좋습니다.

분수 또는 확률처럼 동작하는 연속적인 일대일 응답 변수를 처리하는 네 가지 방법이 있습니다 ( 이 주제에서 가장 정식 / 공개 / 조인 한 스레드 이지만 불행히도 네 가지 옵션이 모두 논의되지는 않습니다).

  1. 그것이 두 정수 의 분수 이고 모든 이 알려진 경우, 이항 GLM이라고하는 표준 로지스틱 회귀를 사용할 수 있습니다. R로 코딩하는 한 가지 방법 은 ( 각 데이터 포인트에 대해 값으로 구성된 벡터 라고 가정 )입니다.=미디엄/n

    glm(p ~ a+b+c, myData, family="binomial", weights=n)
  2. 경우 두 정수의 분수 있지 않은 경우, 하나의 베타 회귀를 사용할 수있다. 이것은 관측 된 가 또는 과 같지 않은 경우에만 작동합니다 . 그렇다면 더 복잡한 제로 / 일 팽창 베타 모델이 가능하지만 더 복잡해집니다 ( 이 스레드 참조 ).01

    betareg(p ~ a+b+c, myData)
  3. 로 짓은 반응을 변환하고 선형 회귀를 사용합니다. 이것은 일반적으로 권장되지 않습니다.

    lm(log(p/(1-p)) ~ a+b+c, myData)
  4. 이항 모형을 피팅 한 다음과 분산을 고려하여 표준 오차를 계산합니다. 표준 오류는 다양한 방법으로 계산할 수 있습니다.

    • (a) 과대 산포 추정 ( 1 , 2 )을 통한 척도 표준 오차 . 이것을 "이분법"GLM이라고합니다.

    • (b) 샌드위치 추정기를 통한 강력한 표준 오차 ( 1 , 2 , 3 , 4 ). 이것을 계량 경제학에서는 "분수 로짓"이라고합니다.


    (a)와 (b)는 동일하지 않습니다 (볼 이 댓글을 , 그리고 이 책의 섹션 3.4.1와 3.4.2 , 그리고 이 SO 포스트이것이것 )하지만, 비슷한 결과를 제공하는 경향이있다. 옵션 (a)는 glm다음과 같이 구현 됩니다.

    glm(p ~ a+b+c, myData, family="quasibinomial")

무작위 효과와 동일한 4 가지 방법을 사용할 수 있습니다.

  1. weights인수 사용 ( one , two ) :

    glmer(p ~ a+b+c + (1|subject), myData, family="binomial", weights=n)

    위의 두 번째 링크에 따르면 과대 산포를 모델링하는 것이 좋습니다 (아래 참조).

  2. 베타 혼합 모델 사용 :

    glmmadmb(p ~ a+b+c + (1|subject), myData, family="beta")

    또는

    glmmTMB(p ~ a+b+c + (1|subject), myData, 
            family=list(family="beta",link="logit"))
    

    응답 데이터에 정확한 0 또는 1이있는 경우에서 0/1 팽창 베타 모델을 사용할 수 있습니다 glmmTMB.

  3. 응답의 로짓 변환 사용 :

    lmer(log(p/(1-p)) ~ a+b+c + (1|subject), myData)
  4. 이항 모형에서 과대 산포를 설명합니다. 이것은 다른 트릭을 사용합니다 : 각 데이터 포인트에 무작위 효과를 추가하십시오 :

    myData$rowid = as.factor(1:nrow(myData))
    glmer(p ~ a+b+c + (1|subject) + (1|rowid), myData, family="binomial",
          glmerControl(optimizer="bobyqa"))
    

    어떤 이유로 glmer()정수가 아닌 것에 대해 불평 p하고 말도 안되는 추정치를 산출 할 때 이것은 제대로 작동하지 않습니다 . 내가 생각해 낸 해결책은 가짜 상수를 사용 weights=k하고 p*k항상 정수 인지 확인하는 것 입니다. 반올림이 필요 p하지만 k충분히 크게 선택 하면 크게 중요하지 않습니다. 결과는의 값에 의존하지 않는 것 같습니다 k.

    k = 100
    glmer(round(p*k)/k ~ a+b+c + (1|subject) + (1|rowid), myData, 
          family="binomial", weights=rowid*0+k, glmerControl(optimizer="bobyqa"))
    

    이후 업데이트 (2018 년 1 월) : 잘못된 방법 일 수 있습니다. 여기에서 토론을 참조 하십시오 . 나는 이것을 더 조사해야한다.


필자의 경우 옵션 # 1을 사용할 수 없습니다.

옵션 # 2는 매우 느리고 수렴에 문제가 있습니다. 실행하는 glmmadmb데 5 분이 걸리고 (수렴하지 않았다고 불평합니다!), lmer2 초 안에 작동 glmer하고 몇 초가 걸립니다. 업데이트 :glmmTMB @BenBolker의 의견에서 제안한대로 시도했지만 glmer수렴 문제없이 거의 빨리 작동 합니다. 이것이 제가 사용할 것입니다.

옵션 # 3과 # 4는 매우 유사한 추정치와 매우 유사한 Wald 신뢰 구간 (으로 획득 confint)을 산출 합니다. 속임수이기 때문에 나는 # 3의 큰 팬이 아닙니다. 그리고 # 4는 다소 해키 느낌입니다.

그의 의견에서 3 번과 4 번으로 나를 지적 한 @Aaron에게 큰 감사를드립니다.


1
좋은 답변, 잘 설명되어 있으며 임의의 효과가없는 모델과 관련이 있습니다. 나는 # 3 (변환) 부정 행위를 부르지 않을 것입니다. 그런 종류의 변환은 이와 같은 분석에서 매우 일반적입니다. 대신 # 3과 # 4는 데이터 분포에 대한 관계와 평균과 분산 사이의 관계에 대해 가정하고 있으며 # 4가 데이터의 규모에 따라 모델링되기 때문에 에 수집되었다는 것이 그 가정이 더 나아질 것이라는 의미는 아닙니다.
Aaron은 Stack Overflow를 남겼습니다.

1
# 3은 확률의 로짓이 일정한 분산으로 정상이라고 가정하고 # 4는 분산이 p (1-p)에 비례한다고 가정합니다. 적합에 대한 설명에서, 이것들은 너무 중요하지 않을 정도로 유사 해 보입니다. 그리고 # 3는 (청중에 따라) 거의 더 표준적인 것이므로 진단이 합리적이라면 내가 선호하는 것입니다.
Aaron은 Stack Overflow를 남겼습니다

1
다른 가능성은 glmmTMB 를 사용하는 것입니다 . 로 설치 한 후 다음을 devtools::install_github("glmmTMB/glmmTMB",sub="glmmTMB")사용하여 glmmTMB(p ~ a+b+c + (1|subject), myData, family=list(family="beta",link="logit"))작동해야합니다.
Ben Bolker

@BenBolker 감사합니다! glmmTMB를 glmmADMB (베타 모델의 경우)보다 선호하거나 그 반대의 이유가 있습니까? 이 패키지 중 하나가 더 최신이거나 더 활발하게 개발 되었습니까? 그 외에도,이 답변에 나열된 방법 중 로지 변환 후 가우시안 glmm, 베타 glmm 또는 (1 | rowid) 항이있는 이항 glmm 중 어떤 접근법을 물어볼 수 있습니까?
amoeba는

1
가능한 경우 베타 GLMM을 선호합니다 . 공변량 / 그룹의 비율 변화를 측정 하기위한 통계 모델입니다 . 성숙하지는 않지만, glmmTMB보다 빠르고 안정적이며 glmmADMB보다 활발한 개발을 진행하고 있습니다.
벤 볼커
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.