我无法弄清楚为什么我无法正确计算贝叶斯信息准则,并希望有人能指出我正确的方向。
我这样做是因为我试图手动计算BIC(对于www-data
对象,这些对象似乎没有与之关联的既定例程)。我从Wikipedia page中得到了公式,它根据剩余的平方和而不是对数似然给出了BIC的公式。
plm
运行代码很多次,我意识到我获得的BIC和从stats包中获得的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!
答案 0 :(得分:3)
感谢评论者的帮助,以下是答案:
y<-rnorm(100)
x<-rnorm(100)
m<-lm(y ~ x)
要获取BIC
或AIC
,首先需要关联的对数似然。
计算对数似然需要残差向量,数据中的观测数量和权重向量(如果适用)
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
计算BIC
或AIC
需要ll
,并且还需要与对数似然计算相关联的df
,其等于原始参数数量估计加1。
k.original<-m$rank
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