如何解决logLik 为正常线性模型返回的对数似然与“标准”手动计算之间的差异
lm
函数的 logLik
方法返回的对数似然似乎与手工计算的不匹配。
为了演示,下面我将一个只有截距的标准线性模型拟合到具有三个点的简单数据集。然后,我使用 logLik
提取对数似然,并通过对在 mle 处评估的 pdf 的对数求和来手动计算它。
test_df <- data.frame(y = c(0,2,4))
mod_lm <- lm(y ~ 1,data = test_df)
ll_logLik <- logLik(mod_lm)
ll_manual <- sum(log(purrr::map_dbl(test_df$y,function(x) dnorm(x,mean = mod_lm$coefficients[1],sd = summary(mod_lm)$sigma))))
c("logLik" = ll_logLik,"manual" = ll_manual)
如上所示,泛型 logLik
返回 -5.836,而手动计算返回 -5.728。
深入logLik
(stats:::logLik.lm
)调用的方法,计算对数似然的关键行可以写成
n <- nrow(test_df); resid_vec <- mod_lm$residuals
-n/2 * (log(2 * pi) + 1 - log(n) + log(sum(resid_vec^2)))
和以前一样给出 -5.728。
但是,根据我对下面对数似然的期望,
sigma <- summary(mod_lm)$sigma
-n/2 * log(2 * pi) - n * log(sigma) - 1/2/sigma^2 * sum(resid_vec^2)
我之前手动计算得到 -5.826。
如果您将模型拟合到更多数据点,例如 1e4,那么手动计算返回的结果、我的公式和 logLik
都相同,直到 7 个重要位置(此后不确定)。例如:
set.seed(4)
test_df <- data.frame(y = rnorm(1e4))
mod_lm <- lm(y ~ 1,"manual" = ll_manual)
两者都产生 -14155.41。
怎么回事?
解决方法
logLik
在参数的最大似然估计值处评估对数似然。系数的最大似然估计与最小二乘估计相同,但方差的最大似然估计的分母是 n
,而 summary(mod_lm)$sigma
是方差的无偏估计,其分母为自由度,此处为 n-1
。所以如果你这样做,你会得到相同的结果:
sd = sqrt(2/3)* summary(mod_lm)$sigma
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。