SAS PROC GLIMMIX가 이항 glmm에 대해 glmer (lme4)와 다른 임의의 기울기를 제공하는 이유는 무엇입니까?


12

저는 R에 더 익숙한 사용자이며 4 개의 서식지 변수에 대해 5 년 동안 약 35 명의 개인에 대한 임의의 기울기 (선택 계수)를 추정하려고했습니다. 응답 변수는 위치가 "사용 된"(1) 또는 "사용 가능한"(0) 서식지 (아래 "사용") 여부입니다.

Windows 64 비트 컴퓨터를 사용하고 있습니다.

R 버전 3.1.0에서는 아래 데이터와 표현식을 사용합니다. PS, TH, RS 및 HW는 고정 효과 (표준화되고 서식지 유형까지 측정 된 거리)입니다. lme4 V 1.1-7.

str(dat)
'data.frame':   359756 obs. of  7 variables:
 $ use     : num  1 1 1 1 1 1 1 1 1 1 ...
 $ Year    : Factor w/ 5 levels "1","2","3","4",..: 4 4 4 4 4 4 4 4 3 4 ...
 $ ID      : num  306 306 306 306 306 306 306 306 162 306 ...
 $ PS: num  -0.32 -0.317 -0.317 -0.318 -0.317 ...
 $ TH: num  -0.211 -0.211 -0.211 -0.213 -0.22 ...
 $ RS: num  -0.337 -0.337 -0.337 -0.337 -0.337 ...
 $ HW: num  -0.0258 -0.19 -0.19 -0.19 -0.4561 ...

glmer(use ~  PS + TH + RS + HW +
     (1 + PS + TH + RS + HW |ID/Year),
     family = binomial, data = dat, control=glmerControl(optimizer="bobyqa"))

glmer는 나에게 맞는 고정 효과에 대한 매개 변수 추정치를 제공하며 무작위 경사 (각 서식지 유형에 대한 선택 계수로 해석)는 데이터를 정 성적으로 조사 할 때도 의미가 있습니다. 모형의 로그 우도는 -3050.8입니다.

그러나 동물 생태학에서 대부분의 연구는 R을 사용하지 않습니다. 동물 위치 데이터를 사용하면 공간 자기 상관을 통해 표준 오류가 제 1 종 오류를 일으키기 쉽습니다. R은 모델 기반 표준 오류를 사용하지만 경험적 (허버 화이트 또는 샌드위치) 표준 오류가 선호됩니다.

R은 현재이 옵션을 제공하지 않지만 (내 지식-PLEASE, 틀린 경우 수정하십시오) SAS는-SAS에 액세스 할 수 없지만 동료가 자신의 컴퓨터를 빌려 표준 오류가 있는지 확인하기로 동의했습니다. 경험적 방법을 사용할 때 크게 변경됩니다.

먼저, 모델 기반 표준 오류를 사용할 때 SAS가 R과 유사한 추정값을 생성하여 모델이 두 프로그램 모두에서 동일한 방식으로 지정되었는지 확인하고자했습니다. 나는 그것들이 정확히 같은지 신경 쓰지 않습니다-그냥 비슷합니다. 나는 (SAS V 9.2)를 시도했다 :

proc glimmix data=dat method=laplace;
   class year id;
   model use =  PS TH RS HW / dist=bin solution ddfm=betwithin;
   random intercept PS TH RS HW / subject = year(id) solution type=UN;
run;title;

나는 라인 추가와 같은 다양한 다른 형태를 시도했다.

random intercept / subject = year(id) solution type=UN;
random intercept PS TH RS HW / subject = id solution type=UN;

나는 지정하지 않고 시도했다.

solution type = UN,

또는 코멘트 아웃

ddfm=betwithin;

우리가 모델을 어떻게 지정했는지 (그리고 우리는 여러 가지 방법을 시도했지만) 고정 효과가 충분히 비슷하더라도 SAS의 임의의 기울기가 R의 출력과 원격으로 유사하지 않습니다. 그리고 내가 다른 것을 의미 할 때, 나는 심지어 표시조차 같지 않다는 것을 의미합니다. SAS의 -2 로그 가능성은 71344.94입니다.

전체 데이터 세트를 업로드 할 수 없습니다. 세 사람의 기록 만 가지고 장난감 데이터 세트를 만들었습니다. SAS는 몇 분 안에 출력을 제공합니다. R에서는 1 시간 이상이 걸립니다. 기묘한. 이 장난감 데이터 세트를 통해 이제 고정 효과에 대한 다른 추정치를 얻습니다.

내 질문 : R과 SAS 사이에서 임의의 기울기 추정치가 왜 그렇게 다른지에 대해 누구나 밝힐 수 있습니까? 호출이 유사한 결과를 생성하도록 코드를 수정하기 위해 R 또는 SAS에서 수행 할 수있는 작업이 있습니까? R 추정값을 더 "믿기"때문에 SAS에서 코드를 변경하려고합니다.

나는 실제로 이러한 차이점에 대해 우려하고 있으며이 문제의 바닥에 도달하고 싶습니다!

R 및 SAS의 전체 데이터 세트에서 35 명의 개인 중 3 명만 사용하는 장난감 데이터 세트의 결과는 jpeg로 포함됩니다.

R 출력 SAS 출력 1 SAS 출력 2 SAS 출력 3


편집 및 업데이트 :

@JakeWestfall이 발견하는 데 도움이되었으므로 SAS의 기울기는 고정 효과를 포함하지 않습니다. 고정 효과를 추가하면 다음과 같은 결과가 나타납니다. 프로그램간에 하나의 고정 효과 "PS"에 대해 R 경사를 SAS 경사와 비교합니다 (선택 계수 = 임의 경사). SAS의 증가 된 변형에 주목하십시오.

PS의 경우 R 대 SAS


나는 이것이 IDR의 요소가 아니라는 것을 알았습니다 . 변경 사항이 있는지 확인하고 확인하십시오.
Aaron은

로그 가능성에 대해 Laplace Approximation을 사용하는 것이 좋습니다. 각각의 로그 우도 점수는 무엇입니까?
usεr11852

1
종속 변수를 같은 방향으로 모델링하고 있는지 확인 했습니까?
Peter Flom-Monica Monica 복원

1
그런데 Peter가 얻는 것은 기본적으로 0s 및 1s 로 표시된 이항 데이터 R를 사용하여 SAS는 "0"응답의 확률을 모델링하는 반면 "1"응답의 확률을 모델링한다는 것입니다. SAS 모델을 "1"확률로 만들려면 응답 변수를로 작성해야합니다 use(event='1'). 물론,이 작업을 수행하지 않더라도 랜덤 효과 분산의 동일한 추정치와 부호가 반대 인 동일한 고정 된 효과 추정치를 여전히 기대해야한다고 생각합니다.
Jake Westfall

1
@EricaN 방금 생각 나게 한 가지는 R ranef()대신 임의 함수를 사용하여 SAS의 효과와 SAS의 효과를 비교해야 한다는 것 coef()입니다. 전자는 실제 랜덤 효과를 제공하고 후자는 랜덤 효과와 고정 효과 벡터를 제공합니다. 따라서 이것은 귀하의 게시물에 표시된 숫자가 다른 이유를 많이 설명하지만 여전히 완전히 설명 할 수없는 상당한 불일치가 남아 있습니다.
Jake Westfall

답변:


11

Zhang et al 2011에 따르면, 임의의 기울기가 패키지간에 유사 할 것으로 예상해서는 안된다고한다. 그들의 논문에서 다른 통계 패키지를 사용한 이항 반응에 대한 일반화 선형 혼합 효과 모델에 대해서는 다음과 같이 설명한다.

요약:

GLMM (Generalized Linear Mixed-effects Model)은 횡단면 데이터 모델을 세로 설정으로 확장하는 데 널리 사용되는 패러다임입니다. 이진 응답 모델링에 적용하면 다른 소프트웨어 패키지 및 패키지 내의 다른 절차에서도 결과가 상당히 다를 수 있습니다. 이 보고서에서 우리는 이러한 다른 절차의 기초가되는 통계적 접근 방식을 설명하고 상관 이진 반응에 적합하도록 적용될 때의 강점과 약점에 대해 설명합니다. 그런 다음 널리 사용되는 일부 소프트웨어 패키지에서 구현 된 이러한 절차를 시뮬레이션 된 실제 연구 데이터에 적용하여 이러한 고려 사항을 설명합니다. 우리의 시뮬레이션 결과는 고려 된 대부분의 절차에 대한 신뢰성이 부족함을 나타내며, 이러한 인기있는 소프트웨어 패키지를 실제로 적용하는 데 상당한 영향을 미칩니다.

@BenBolker와 팀이 R 인터페이스를 선호하고 적용 할 수 있기를 원하기 때문에 @ 임의의 기울기 항을 가진 모델에 대한 경험적 표준 오류 및 가우스-Hemite Quadrature 기능을 통합하기 위해 R에 대한 투표로 내 질문을 고려하기를 바랍니다. 그 프로그램에서 몇 가지 추가 분석. 행복하게도 R과 SAS가 임의의 기울기에 대해 비슷한 값을 갖지 않더라도 전체 추세는 동일합니다. 귀하의 의견을 보내 주셔서 감사합니다. 시간과 관심을 가져 주셔서 감사합니다.


죄송합니다 : "표준 표준 오류"란 무엇입니까? 분산 성분의 표준 오차를 의미합니까? 아니면 샌드위치 표준 오류를 의미합니까?
Ben Bolker

죄송합니다. 경험적 / 샌드위치 SE를 의미했습니다. 응답을 편집했습니다.
Nova

@BenBolker 통합 된 적이 있습니까?
Lepidopterist

아니. 기술적으로 연구 프로그램의 일부가 아니기 때문에 이와 같은 개발을 어떻게 지원할 것인지 계속 파악하려고 노력하고 있습니다.
Ben Bolker

4

답변과 해설 / 추가 질문의 혼합 :

나는 '장난감'데이터 세트에 세 가지 다른 최적화 옵션을 적용했습니다. (* 주 1 : 그룹화 변수를 서브 샘플링하는 것이 아니라 매년 및 id 내에서 서브 샘플링하여 작은 데이터 세트를 만드는 것이 비교 목적에 더 유용 할 것입니다. 소수의 그룹화 변수 수준에서 특히 잘 작동합니다.

library(plyr)
subdata <- ddply(fulldata,c("year","id"),
    function(x) x[sample(nrow(x),size=round(nrow(x)*0.1)),])

배치 피팅 코드 :

Ntoy <- readRDS("Newton_toy.RDS")
library(lme4)
fitfun <- function(opt) {
    tt <- system.time(fit1 <- glmer(use ~  ps + th + rs + hw +
                                    (1 + ps + th + rs + hw |id/year),
                                    family = binomial, data = Ntoy,
                                    control=glmerControl(optimizer=opt),
                                    verbose=100))
    return(list(time=tt,fit=fit1))
}

opts <- c("nloptwrap","nlminbwrap","bobyqa")
## use for() instead of lapply so we can checkpoint more easily
res <- setNames(vector("list",length(opts)),opts)
for (i in opts) {
    res[[i]] <- fitfun(i)
    save("res",file="Newton_batch.RData")
}

그런 다음 새로운 세션에서 결과를 읽었습니다.

load("Newton_batch.RData")
library(lme4)

경과 시간 및 이탈 :

cbind(time=unname(sapply(res,function(x) x$time["elapsed"])),
          dev=sapply(res,function(x) deviance(x$fit)))
##                time      dev
## nloptwrap  1001.824 6067.706
## nlminbwrap 3495.671 6068.730
## bobyqa     4945.332 6068.731

이 편차는 R의 OP (6101.7)에 의해보고 된 편차보다 상당히 낮고, SAS의 OP (6078.9)에 의해보고 된 것보다 약간 낮습니다 (패키지 간의 편차를 항상 비교할 수는 없지만).

SAS가 약 100 개의 기능 평가만으로 수렴한다는 사실에 놀랐습니다!

OP의 경험과 일치하는 nloptwrap시간 bobyqa은 Macbook Pro 에서 17 분 ( )에서 80 분 ( )까지입니다. 편차가 조금 더 낫습니다 nloptwrap.

round(cbind(sapply(res,function(x) fixef(x$fit))),3)
##             nloptwrap nlminbwrap bobyqa
## (Intercept)    -5.815     -5.322 -5.322
## ps             -0.989      0.171  0.171
## th             -0.033     -1.342 -1.341
## rs              1.361     -0.140 -0.139
## hw             -2.100     -2.082 -2.082

nloptwrap표준 오류는 상당히 크지 만 답변은 상당히 다릅니다 .

round(coef(summary(res[[1]]$fit)),3)
##             Estimate Std. Error z value Pr(>|z|)
## (Intercept)   -5.815      0.750  -7.750    0.000
## ps            -0.989      1.275  -0.776    0.438
## th            -0.033      2.482  -0.013    0.989
## rs             1.361      2.799   0.486    0.627
## hw            -2.100      0.490  -4.283    0.000

(여기의 코드 year:id는 추적해야한다는 경고를 제공 합니다)

계속하려면 ...?


전체 데이터 세트를 보내면 더 도움이 될까요? 유일한 문제는 전체 데이터 세트에서 수렴에 약 9 시간이 걸리므로 샘플링에 대한 제안은 좋은 것입니다. 로그 변환으로 데이터를 변환하려고했지만 비닝 잔차 플롯이 여전히 추악합니다. 잔차 플롯이 이러한 데이터의 문제의 일부를 설명한다고 생각하십니까? 마지막으로 SAS에서 결과가 R과 비슷 했습니까?
Nova
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.