간단한 R lm 모델에서 로그 우도 재 계산


10

lm 모델 (R)에서 logLik 함수가 제공하는 로그 가능성을 dnorm ()으로 다시 계산하려고합니다.

많은 수의 데이터 (예 : n = 1000)에 대해 (거의 완벽하게) 작동합니다.

> n <- 1000
> x <- 1:n
> set.seed(1)
> y <- 10 + 2*x + rnorm(n, 0, 2)
> mod <- glm(y ~ x, family = gaussian)
> logLik(mod)
'log Lik.' -2145.562 (df=3)
> sigma <- sqrt(summary(mod)$dispersion)
> sum(log(dnorm(x = y, mean = predict(mod), sd = sigma)))
[1] -2145.563
> sum(log(dnorm(x = resid(mod), mean = 0, sd = sigma)))
[1] -2145.563

그러나 작은 데이터 세트의 경우 분명한 차이점이 있습니다.

> n <- 5
> x <- 1:n
> set.seed(1)
> y <- 10 + 2*x + rnorm(n, 0, 2)
> 
> mod <- glm(y ~ x, family = gaussian)
> logLik(mod)
'log Lik.' -8.915768 (df=3)
> sigma <- sqrt(summary(mod)$dispersion)
> sum(log(dnorm(x = y, mean = predict(mod), sd = sigma)))
[1] -9.192832
> sum(log(dnorm(x = resid(mod), mean = 0, sd = sigma)))
[1] -9.192832

작은 데이터 세트 효과 때문에 lm과 glm 사이의 잔차 분산 추정치의 차이로 인한 것일 수 있지만 lm을 사용하면 glm과 동일한 결과를 얻을 수 있다고 생각했습니다.

> modlm <- lm(y ~ x)
> logLik(modlm)
'log Lik.' -8.915768 (df=3)
> 
> sigma <- summary(modlm)$sigma
> sum(log(dnorm(x = y, mean = predict(modlm), sd = sigma)))
[1] -9.192832
> sum(log(dnorm(x = resid(modlm), mean = 0, sd = sigma)))
[1] -9.192832

내가 어디 틀렸어?


2
lm(), 사용중인 대신 . σ^σ^
Stéphane Laurent

수정에 대한 Stéphane에게 감사하지만 여전히 작동하지 않는 것
Gilles

소스 코드를 살펴보십시오 :stats:::logLik.glm
가정 정상

나는 이것을했지만이 기능은 로그 가능성을 다시 찾기 위해 glm 객체에서 aic 슬롯을 뒤집습니다. 그리고 glm 함수에서 aic에 대해서는 아무것도 보지 못합니다 ...
Gilles

나는 이것이 3 개의 매개 변수 (기울기, 절편 및 분산 / 잔류 표준 오류)가 추정되는 것을 가정하고 LogLik 및 AIC (엉덩이에 묶여 있음)와 관련이 있다고 생각하지만 분산 / 잔류 표준 오류는 가정합니다. 두 개의 매개 변수가 추정됩니다 (기울기 및 절편).
Tom

답변:


12

logLik()함수는 매개 변수의 ML 추정값을 알 수없는 매개 변수 값으로 대체 하여 로그 우도 평가를 제공합니다 . 이제, 회귀 파라미터의 최대 우도 추정 ( 집에서 최소 제곱 추정치)와 일치하고 있지만의 ML 추정 IS 이지만 을 사용합니다. 이는 편견의 제곱근입니다 추정치입니다 .β제이엑스βσϵ^나는2σ^=ϵ^나는22σ2

>  n <- 5
>  x <- 1:n
>  set.seed(1)
>  y <- 10 + 2*x + rnorm(n, 0, 2)
>  modlm <- lm(y ~ x)
>  sigma <- summary(modlm)$sigma
> 
>  # value of the likelihood with the "classical" sigma hat
>  sum(log(dnorm(x = y, mean = predict(modlm), sd = sigma)))
[1] -9.192832
> 
>  # value of the likelihood with the ML sigma hat
>  sigma.ML <- sigma*sqrt((n-dim(model.matrix(modlm))[2])/n) 
>  sum(log(dnorm(x = y, mean = predict(modlm), sd = sigma.ML)))
[1] -8.915768
>  logLik(modlm)
'log Lik.' -8.915768 (df=3)

그런데 lme / lmer 모델의 REML / ML 옵션에 대해서도 마찬가지로주의해야합니다.
Stéphane Laurent

(+1) 의 분모에서 n-1입니까, 아니면 실제로 n-2 입니까? σ^
Patrick Coulombe

@PatrickCoulombe 아니오 : 가로 채기 + 경사
스테판 로랑

좋아, 이제 완전히 지워 고마워요! 그러나 REML / ML (GuR의 마지막 게시물과 관련이있는 것)은 무엇을 의미합니까? 설명해주세요. 배우고 싶습니다 !
Gilles

혼합 모형에서 분산 성분의 REML 추정치는 "편향 보정"ML 추정과 같습니다. GuR에 대한 귀하의 게시물을 아직 보지 못했습니다 :)
Stéphane Laurent
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.