我无法弄清楚为什么我在正确计算贝叶斯信息准则时会遇到麻烦,并希望有人可以指出正确的方向。
我这样做是因为我试图手动计算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之间的差异是恒定的,因此我怀疑我缺少某种缩放因子。是对的吗?提前致谢。
编辑:感谢您的所有评论。我尝试实现建议并发布答案,但是我仍然不知所措。修改后的代码如下。
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)
要获取
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<-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
关于r - 手动计算lm对象的BIC,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35131450/