【问题标题】:Using predict with svyglm将预测与 svyglm 一起使用
【发布时间】:2016-11-07 19:01:03
【问题描述】:

我发现predictsurvey 包中的svyglm 对象存在一些奇怪的行为。如果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 包有问题?

【问题讨论】:

    标签: r linear-regression survey


    【解决方案1】:

    你没有考虑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)))
    

    我会把它放在为包裹做的事情清单上。

    【讨论】:

    • 感谢 Lumley 教授。
    • 而版本 3.31-5,现在基于 r-forge,将 $xlevels 的使用添加到 predict.svyglm
    猜你喜欢
    • 2018-09-30
    • 2023-03-31
    • 1970-01-01
    • 2016-09-21
    • 2020-10-31
    • 2020-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多