为 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)
要获得 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
我不太明白为什么我无法正确计算贝叶斯信息准则,希望有人能指出正确的方向。
我这样做是因为我试图手动计算 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)
要获得 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