2016-11-07 206 views
3

我發現一些奇怪的行爲與predictsvyglm對象從survey包。如果您在predict newdata有一個水平的一個因素/字符它吐出錯誤:使用預測與svyglm

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包?

回答

4

您沒有在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))) 

我將它放在要做的事情列表上。

+0

謝謝Lumley教授。 – Carl

+3

現在構建在r-forge上的3.31-5版本在'predict.svyglm'中增加了'$ xlevels'的使用 –