为 lm 对象手动计算 BIC

Calculating BIC manually for lm object

我不太明白为什么我无法正确计算贝叶斯信息准则,希望有人能指出正确的方向。

我这样做是因为我试图手动计算 BIC(对于 plm 对象,这些对象似乎没有与之关联的既定例程)。我从 Wikipedia page 中获取了公式,它根据残差平方和而不是对数似然给出了 BIC 的公式。

y<-rnorm(100)
x<-rnorm(100)
m.test<-lm(y ~ x) 

n<-100 
rss<-sum(m.test$residuals^2) 
k<-3 
bic.mine<-n*log(rss/n)+k*log(n) #formula from wikipedia
bic.stats<-BIC(m.test) #using stats package
abs(bic.mine-bic.stats) #mine is off!

运行 代码很多次,我意识到我获得的 BIC 和从 stats 包中获得的 BIC 之间的差异是恒定的,所以我怀疑我遗漏了某种比例因子。那正确吗?提前致谢。

编辑:感谢所有评论。我尝试实施这些建议并 post 一个答案,但我仍然偏离常量。修改后的代码如下。

y<-rnorm(100)
x<-rnorm(100)
m.test<-lm(y ~ x) 

n<-100
res<-m.test$residuals
rss<-sum(res^2) 
k<-3; df<-n-k; w<-rep(1,N) #params, dfs, weights
ll<-0.5 * (sum(log(w)) - n *
             (log(2 * pi) + 1 - log(n) + log(sum(w * res^2))))
ll.stats<-logLik(m.test)
abs(ll.stats-ll)==0 #same, prob is not here

bic.mine<-n*log(rss/n)+k*log(n) #formula from wikipedia
bic.exact<- -2 * ll + log(n) * df #suggestions from comments
bic.stats<-BIC(m.test) #using stats package
abs(bic.mine-bic.stats) #mine was off
abs(bic.exact-bic.stats) #this is still off, though

感谢评论者的帮助,答案如下:

y<-rnorm(100)
x<-rnorm(100)
m<-lm(y ~ x) 

要获得 BICAIC,您首先需要关联的对数似然。

计算对数似然需要一个残差向量、数据中的观测数和一个权重向量(如果适用)

res<-m$residuals
n<-nrow(m$model)    
w<-rep(1,n) #not applicable

ll<-0.5 * (sum(log(w)) - n * (log(2 * pi) + 1 - log(n) + log(sum(w * res^2))))
ll-logLik(m)==0 #TRUE

计算BICAIC需要ll,另外需要df与计算对数似然相关,等于原数正在估计的参数加 1。

k.original<-length(m$coefficients)
df.ll<-k.original+1 
bic<- -2 * ll + log(n) * df.ll
bic-BIC(m)==0 #TRUE
aic<- -2 * ll + 2 * df.ll
aic-AIC(m)==0 #TRUE