Tôi chỉ đơn giản là cố gắng tính toán lại với dnorm () khả năng đăng nhập được cung cấp bởi hàm logLik từ mô hình lm (trong R).
Nó hoạt động (gần như hoàn hảo) cho số lượng dữ liệu cao (ví dụ 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
nhưng đối với các tập dữ liệu nhỏ có sự khác biệt rõ ràng:
> 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
Do hiệu ứng dữ liệu nhỏ, tôi nghĩ rằng nó có thể là do sự khác biệt trong ước tính phương sai còn lại giữa lm và glm nhưng sử dụng lm cung cấp kết quả tương tự như 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
Tôi sai ở đâu
stats:::logLik.glm
lm()
, bạn đang sử dụng thay vì .