将预测与 svyglm 结合使用
Using predict with svyglm
我发现 predict
和 survey
包中的 svyglm
对象有一些奇怪的行为。如果 predict
中的新数据有一个 factor/character 一级,它会报错:
Error in `contrasts<-`(`*tmp*`, value = contr.funs[1 + isOF[nn]]) :
contrasts can be applied only to factors with 2 or more levels
如果我将一级变量作为模型的预测变量,这个错误是有意义的,但对于新数据,我没有看到问题。
使用常规 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
包的问题?
你没有在 newdata
中加入一个因素;您正在放入一个字符串。您应该放入一个具有 相同水平集 的因子作为用于拟合模型的因子(不是一些随机短语)——这是唯一的设计矩阵有意义的方式。
predict(svymodel, data.frame(sch.wide=factor(rep("No",10),levels=c("No","Yes"))))
predict.lm
从拟合对象恢复因子水平(我不记得这是在 2002 年左右,但我可能是错的)。您可以使用该方法实现自动化:
predict(svymodel, data.frame(sch.wide=factor(rep("No",10),levels=svymodel$xlevels$sch.wide)))
我会把它放在为包裹做的事情清单上。
我发现 predict
和 survey
包中的 svyglm
对象有一些奇怪的行为。如果 predict
中的新数据有一个 factor/character 一级,它会报错:
Error in `contrasts<-`(`*tmp*`, value = contr.funs[1 + isOF[nn]]) :
contrasts can be applied only to factors with 2 or more levels
如果我将一级变量作为模型的预测变量,这个错误是有意义的,但对于新数据,我没有看到问题。
使用常规 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
包的问题?
你没有在 newdata
中加入一个因素;您正在放入一个字符串。您应该放入一个具有 相同水平集 的因子作为用于拟合模型的因子(不是一些随机短语)——这是唯一的设计矩阵有意义的方式。
predict(svymodel, data.frame(sch.wide=factor(rep("No",10),levels=c("No","Yes"))))
predict.lm
从拟合对象恢复因子水平(我不记得这是在 2002 年左右,但我可能是错的)。您可以使用该方法实现自动化:
predict(svymodel, data.frame(sch.wide=factor(rep("No",10),levels=svymodel$xlevels$sch.wide)))
我会把它放在为包裹做的事情清单上。