我有一个搜索算法,它使用R调查包函数AIC.svyglm
对线性回归模型。我将软件包更新到4.1-1版本,新功能出现了一些问题。
我注意到在帮助页,在新版本中,"高斯链接模型的extractAIC
使用基于方差参数和回归参数的极大似然估计的实际AIC;而它使用的是Rao-Scott近似,所以我不期望得到相同的结果。然而,我注意到一个意想不到的行为。
下面是一个简单的例子:
library(survey)
data(api)
# Define a simple design, for illustration
dclus2<-svydesign(id=~0, weights=~pw, data=apiclus2)
# 3 models (note: Gaussian family)
model0<-svyglm(I(sch.wide=="Yes")~ell+meals+mobility,
design=dclus2, family=gaussian())
model1<-update(model0, formula = .~.+as.numeric(stype),
design=dclus2, family=gaussian())
model2<-update(model0, formula = .~.+stype,
design=dclus2, family=gaussian())
# 'Equivalent' lm
model0lm<-lm(I(sch.wide=="Yes")~ell+meals+mobility, data=apiclus2, weights=pw)
model1lm<-update(model0lm, formula = .~.+as.numeric(stype))
model2lm<-update(model0lm, formula = .~.+stype)
summary(model1)
summary(model1lm)
#AIC on svyglm
AIC(model0,model1, model2)
#AIC on lm
AIC(model0lm,model1lm, model2lm)
对于svyglm,结果如下:
eff.p AIC deltabar
[1,] 8.686176 803.6719 2.171544
[2,] 14.317939 811.0289 2.863588
[3,] 30.163107 746.8759 5.027185
,而我们确实期望模型1的AIC低于模型0的AIC。对于stats
lm
df AIC
model0lm 5 198.6607
model1lm 6 166.9859
model2lm 7 131.5015
我错过什么了吗?
我使用R版本4.1.0和survey版本4.1-1
我建议直接从svyglm模型中读取AIC值,就像这样:
c(model0$aic, model1$aic, model2$aic)
#[1] 198.6607 166.9859 131.5015
注意,通过这种方式,您将获得与应用于lm模型的AIC
函数完全相同的值。
AIC(model0lm,model1lm, model2lm)
# df AIC
# model0lm 5 198.6607
# model1lm 6 166.9859
# model2lm 7 131.5015
我意识到这并没有回答为什么这与AIC(model0, model1, model2)
的结果不同的问题。然而,也许这将是解决你问题的办法。