AIC, anova 오류 : 모형이 모두 동일한 수의 관측치에 적합하지는 않습니다. 모형이 모두 동일한 크기의 데이터 세트에 적합하지 않았습니다.


10

나는 이런 모델을 가지고있다 :

require(nlme)

set.seed(123)
n <- 100
k <- 5
cat <- as.factor(rep(1:k, n))
cat_i <- 1:k # intercept per kategorie
x <- rep(1:n, each = k)
sigma <- 0.2
alpha <- 0.001
y <- cat_i[cat] + alpha * x + rnorm(n*k, 0, sigma)
plot(x, y)

m1 <- lm(y ~ x)
summary(m1)

m2 <- lm(y ~ cat + x)
summary(m2)

m3 <- lme(y ~ x, random = ~ 1|cat, na.action = na.omit)
summary(m3)

이제 임의 효과가 모델에 있어야하는지 평가하려고합니다. 따라서 AIC 또는 anova를 사용하여 모델을 비교하면 다음 오류가 발생합니다.

> AIC(m1, m2, m3)
   df       AIC
m1  3 1771.4696
m2  7 -209.1825
m3  4 -154.0245
Warning message:
In AIC.default(m1, m2, m3) :
  models are not all fitted to the same number of observations  
> anova(m2, m3)
Error in anova.lmlist(object, ...) : 
  models were not all fitted to the same size of dataset

보시다시피, 두 경우 모두 동일한 데이터 세트를 사용합니다. 나는 두 가지 치료법을 찾았지만 만족스러운 것으로 생각하지 않습니다.

  1. method = "ML"lme () 호출에 추가 -메소드를 변경하는 것이 좋은지 확실하지 않습니다.
  2. 사용 lmer()대신에. 놀랍게도 이것은 lmer ()가 REML 메소드를 사용한다는 사실에도 불구하고 작동합니다. 그러나 lmer()계수에 대한 p- 값을 표시하지 않기 때문에이 솔루션을 좋아하지 않습니다 lme(). 대신 구형을 사용하고 싶습니다 .

이것이 버그인지 아닌지, 어떻게 해결할 수 있습니까?

답변:


7

빠른 검색 은 가능 하다는 것을 보여 주지만 (필자는 그렇지 않다는 것을 인정해야하지만) 버그는 아닙니다 ... R의 메소드가 숨겨져 예기치 않은 것처럼 보이는 결과가 발생하는 또 다른 경우 '이지만 RTFM 군중은 "문서에 있습니다"라고 말합니다. 어쨌든 ... 당신의 솔루션을하는 것입니다 anovalme첫 번째 인수와 같은 lm모델 두 번째로 (그리고 만약 당신이 좋아하면 세 번째) 인수 (들). 이것이 이상하게 보이면 조금 이상하기 때문입니다. 그 이유는 당신이 호출 할 때이다 anovaanova.lme방법은 첫 번째 인수는 경우에만 호출 될 lme객체입니다. 그렇지 않으면 호출합니다 anova.lm(이후 호출 anova.lmlist;으로 파헤 치면 anova.lm이유를 알 수 있습니다). 전화를 거는 방법에 대한 자세한 내용anova이 경우에 대한 도움말을 표시하십시오 anova.lme. 다른 모델과 lme모델을 비교할 수 있지만 첫 번째 인수 이외의 위치에 있어야합니다. 분명히 모델 인수의 순서에 너무 신경 쓰지 않고 함수를 anova사용하여 맞는 모델에 사용할 수도 있습니다 gls. 그러나 나는 그것이 좋은 아이디어인지 아닌지, 또는 그것이 정확히 의미하는 바를 결정할 수있는 세부 사항을 충분히 알지 못합니다 (아마도 괜찮지 만 당신의 전화). 그 링크에서를 비교 lm하는 lme것은 문서화되고 방법으로 인용 된 것처럼 보이므로 그 방향으로 잘못했습니다.

행운을 빕니다.


1
Gavin의 부록이있는 AIC에 관한 user11852의 답변, 특별한 AIC.lme 또는 그 문제를 해결하기위한 어떤 것도없고 모든 것이 제 급여 등급을 넘어 서기 시작합니다
russellpierce

4

이것은 확실히 독특합니다. 모델 (다른 고정 구조의 효과를 갖는 곳 모델의 비교를 할 때, 제 1로 생각 m2하고 m3, 예를 들면)이 우리에게 최선 같은 것 "변경" . (그것은 그것을 곱하면됩니다 , 즉, 그것을 사용하여 작동을 재미) 내가 그것을 버그하지 않을 수 있습니다 생각하게한다. "좋은 습관"을 집행하는 것처럼 보입니다.MLREMLykkX=0method="ML"

그렇게 말하면서 후드를 살펴 보겠습니다.

 methods(AIC)  
 getAnywhere('AIC.default')

 A single object matching AIC.default was found
 It was found in the following places
   registered S3 method for AIC from namespace stats
   namespace:stats with value

 function (object, ..., k = 2) 
 {
     ll <- if ("stats4" %in% loadedNamespaces()) 
         stats4:::logLik
     else logLik
     if (!missing(...)) {
         lls <- lapply(list(object, ...), ll)
         vals <- sapply(lls, function(el) {
             no <- attr(el, "nobs") #THIS IS THE ISSUE!
             c(as.numeric(el), attr(el, "df"), if (is.null(no)) NA_integer_ else no)
         })
         val <- data.frame(df = vals[2L, ], ll = vals[1L, ])
         nos <- na.omit(vals[3L, ])
         if (length(nos) && any(nos != nos[1L])) 
             warning("models are not all fitted to the same number of observations")
         val <- data.frame(df = val$df, AIC = -2 * val$ll + k * val$df)
             Call <- match.call()
             Call$k <- NULL
         row.names(val) <- as.character(Call[-1L])
         val
     }
     else {
         lls <- ll(object)
         -2 * as.numeric(lls) + k * attr(lls, "df")
     }     
 }

귀하의 경우에 당신은 그것을 볼 수 있습니다 :

  lls <- lapply(list(m2,m3), stats4::logLik)
  attr(lls[[1]], "nobs")
  #[1] 500
  attr(lls[[2]], "nobs")
  #[1] 498

그리고 logLik아마도 (아마도?) 예기치 않은 일을하고 있습니까 ...? 당신의 문서를 보면 아니, 정말,하지 logLik, ?logLik당신은 그것을 볼 수 있습니다 명시되어있다 :

 There may be other attributes depending on the method used: see
 the appropriate documentation.  One that is used by several
 methods is "nobs"’, the number of observations used in estimation
 (after the restrictions if REML = TRUE’)

원래의 요점으로 돌아가려면을 사용해야합니다 ML.

CS에서 일반적인 말을 사용하려면 : "버그가 아니라 (실제) 기능입니다!"

편집 : (당신의 의견을 해결하기 위해 :) lmer이번에 다른 모델을 사용한다고 가정하십시오 .

m3lmer <- lmer(y ~ x + 1|cat)

그리고 당신은 다음을 수행합니다 :

lls <- lapply(list(m2,m3, m3lmer), stats4::logLik)
attr(lls[[3]], "nobs")
#[1] 500
 attr(lls[[2]], "nobs")
#[1] 498

이것은 둘 사이의 명확한 불일치처럼 보이지만 실제로 Gavin이 설명한 것과 다릅니다. 명백한 것을 말하면 :

 attr( logLik(lme(y ~ x, random = ~ 1|cat, na.action = na.omit, method="ML")),
 "nobs")
#[1] 500

내가 생각하는 방법론의 관점에서 이것이 일어나는 이유는 충분합니다. 모델 비교를 수행 할 때 ML 결과로 즉시 lme넘어가는 동안 LME 회귀를 이해하려고 시도 lmer합니다. 나는 더이 문제에 버그가 없다고 생각 lme하고 lmer각 패키지 뒤에 바로 다른 근거는.

또한 진행 상황에 대한 통찰력있는 설명에 대한 Gavin Simposon의 의견을 참조하십시오 anova()(실제로 동일한 일이 발생합니다 AIC)


"ML을 사용해야합니다"-어떻게 lmerREML (모델 요약 참조)을 사용하고 AIC에서 잘 작동하는지 설명 할 수 있습니까? 따라서 두 가지 가능성이 있습니다. 1) 오류 메시지는 버그가 아닌 * a 기능 이며 작동한다는 사실 lmer은 버그입니다. 또는 2) 오류 메시지는 기능 이 아닌 버그 입니다.
Curious

업데이트 된 게시물을 참조하십시오 (코드를 포함해야했습니다). 나는 원래의 답변을 쓸 때 자신의 유효한 요점을 스스로 알고 있었지만 원래는 그것을 지키지 않기로 결정했습니다.
usεr11852

4
@Tomas lmer() 비교를 요청할 때 REML을 사용 하지 않습니다 . IIRC에는 멋진 설탕이 포함되어 lmer()있으므로 분산 매개 변수를 가장 잘 추정하기 위해 개별 적합을 ML원할 때 적합을 비교하기 위해 모형을 다시 맞출 필요가 없습니다 REML. 을보고 통화를 ?lmer포함하여 첫 번째 LME 예제를 실행하십시오 anova(fm1, fm2). anova()인쇄 된 출력에서 보고 된 로그 가능성 과 이전에 보고 된 로그 가능성을 살펴보십시오 . anova()지고 ML 당신을 위해 추정하고있다.
개빈 심슨

좋은 지적 개빈, 나는 lmer동시에 두 가지를 모두 얻었음을 잊어 버립니다 (PLS를 사용하므로 한 번에 하나만 추정합니다). 당신이 언급 한 것을 확인하는 것을 잊었습니다.
usεr11852

2
@rpierce : AIC는보고 anova() ML에 따라 하나입니다. 보고 된 AIC는 AIC()REML을 기반으로 한 것입니다.
usεr11852
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.