2016-02-01 4 views
2

Я не могу понять, почему у меня возникают проблемы с вычислением байесовского информационного критерия правильно и надеялся, что кто-то может указать мне в правильном направлении.Расчет BIC вручную для объекта lm

Я делаю это, потому что я пытаюсь вычислить 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 я получить и 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 
+2

Хех, мне это нравится вопрос :) Я думаю, что самый простой способ - посмотреть исходный код 'BIC'. С помощью 'методов (BIC)' вы можете видеть, что существует два метода. Я предполагаю, что 'BIC.default' вызывается, но если вы наберете' BIC.default', вы получите сообщение об ошибке. Используйте 'stats ::: BIC.default' вместо этого, чтобы увидеть исходный код. Здесь вы можете увидеть, как рассчитывается BIC и сравнивается с вашим собственным скриптом. Надеюсь, это поможет хотя бы немного. – Laterow

+2

@Laterow в общем использовании 'getAnywhere (" BIC.default ")' в случае, если вы не знаете пакет – MichaelChirico

+2

из '? BIC'" BIC определяется как 'AIC (object, ..., k = log (nobs (объект))) '"; как в AIC, приводится цитата из Сакамото, Ишигуро и Кигагавы _Akaike. Статистика статистических данных – MichaelChirico

ответ

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 
Смежные вопросы