使用预测与svyglm

时间:2016-11-07 19:01:03

标签: r linear-regression survey

我发现predictsvyglm包中的survey对象有些奇怪的行为。如果predict中的新数据具有一个级别的因子/字符,则会发出错误:

Error in `contrasts<-`(`*tmp*`, value = contr.funs[1 + isOF[nn]]) : 
contrasts can be applied only to factors with 2 or more levels

如果我将一个级别的变量作为模型的预测变量,则此错误是有意义的,但对于newdata,我没有看到问题。

使用常规glm,这样可以正常使用。

MRE:

library(survey)

data(api)

dstrat<-svydesign(id=~1,strata=~stype, weights=~pw, data=apistrat, fpc=~fpc)

svymodel <- svyglm(api00~sch.wide,design=dstrat)
# errors
predict(svymodel, data.frame(sch.wide=rep("No",10)))

regmodel <- glm(api00~sch.wide,data=apistrat)
# works
predict(regmodel,data.frame(sch.wide=rep("No",10)))

我发现如果我破解了因子的水平就行了,但这不是必要的:

svymodel <- svyglm(api00~sch.wide,design=dstrat)

predict(svymodel, data.frame(sch.wide=factor(rep("No",10),
                                             levels = c("No","random phrase"))))

我是否误解了某些内容,或者这是survey包的问题?

1 个答案:

答案 0 :(得分:4)

你不能在[{1}}中加入一个因素;你需要输入一个字符串。你应该使用相同的一组级别作为用于拟合模型的因子(而不是一些随机短语) - 这个&#39;是设计矩阵有意义的唯一方法。

newdata

predict(svymodel, data.frame(sch.wide=factor(rep("No",10),levels=c("No","Yes")))) 从适合的物体中恢复因子水平(我不记得这在2002年左右,但我可能错了)。您可以使用该方法进行自动化:

predict.lm

我将把它放在要为包装做的事情清单上。