Tính toán lại khả năng đăng nhập từ một mô hình R lm đơn giản


10

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


2
Với lm(), bạn đang sử dụng thay vì . σ^σ^
Stéphane Laurent

Cảm ơn Stéphane vì đã sửa nhưng dường như nó vẫn không hoạt động
Gilles

hãy thử nhìn vào mã nguồn:stats:::logLik.glm
giả sử

Tôi đã làm điều này nhưng chức năng này chỉ đảo ngược khe aic từ đối tượng glm để tìm lại khả năng đăng nhập. Và tôi không thấy gì về aic trong chức năng glm ...
Gilles

Tôi nghi ngờ điều này có liên quan đến LogLik và AIC (được gắn với nhau ở hông) giả sử rằng ba tham số đang được ước tính (độ dốc, chặn và phân tán / lỗi tiêu chuẩn dư) trong khi lỗi sai phân tán / tiêu chuẩn còn lại được tính toán hai tham số được ước tính (độ dốc và đánh chặn).
Tom

Câu trả lời:


12

Các logLik()chức năng cung cấp các đánh giá của loga bởi thay dự toán ML các thông số cho các giá trị của các thông số chưa biết. Bây giờ, ước tính khả năng tối đa của các tham số hồi quy ( trong ) trùng với ước tính bình phương nhỏ nhất, nhưng ước tính ML của là , trong khi bạn đang sử dụng , đó là căn bậc hai của không thiên vị ước tính của .βjXβσϵ^i2nσ^=ϵ^i2n2σ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)

Bằng cách này, bạn phải cẩn thận tương tự với tùy chọn REML / ML cho các mô hình lme / lmer.
Stéphane Laurent

(+1) Đây có phải là n-1 hay thực sự là n-2 trong mẫu số của ? σ^
Patrick Coulombe

@PatrickCoulombe No: đánh chặn + độ dốc
Stéphane Laurent

Ok, hoàn toàn rõ ràng bây giờ. Cảm ơn rất nhiều ! Nhưng bạn có ý nghĩa gì với REML / ML (một cái gì đó để làm với bài đăng cuối cùng của tôi trên GuR tôi đoán)? Hãy giải thích (có thể). Tôi muốn học !
Gilles

Các ước tính REML của các thành phần phương sai trong các mô hình hỗn hợp giống như các ước tính ML "được sửa cho sai lệch". Tôi chưa thấy bài đăng của bạn trên GuR :)
Stéphane Laurent
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.