使用survey包svyciprop的logit/likelihood方法时遇错误求助
解决survey包中svyciprop使用logit/likelihood方法报错的问题
问题根源
你遇到的报错all variables must be in design= argument,核心原因是:svyciprop的logit和likelihood方法底层依赖svyglm拟合模型,而svyglm要求公式中的变量必须是调查设计对象中已提前存在的变量,不能在公式里用I(y==1)这种临时计算的方式。其他方法(beta/xlogit/asin/mean)不需要调用svyglm,所以可以正常运行。
另外注意你第二次创建调查对象的代码有笔误:weights==~pweight是双等号,应该改成weights=~pweight,不过这不是报错的核心原因。
解决方案
步骤1:提前创建二元变量
在原始数据框中先把y==1的结果存为一个新变量,避免在公式中临时计算:
df$y_bin <- as.integer(df$y == 1)
步骤2:正确创建调查设计对象
修正笔误后重新生成设计对象(推荐用公式形式指定变量,更符合survey包的规范):
wsvy <- svydesign(ids=~psu, strata=~strata, weights=~pweight, fpc=~N, data=df)
步骤3:用新变量调用svyciprop
现在使用logit或likelihood方法就可以正常运行了:
# logit方法 prop_logit <- svyciprop(~y_bin, wsvy, method="logit", level=0.95) # likelihood方法 prop_likelihood <- svyciprop(~y_bin, wsvy, method="likelihood", level=0.95)
关于Agresti-Coull/Wilson区间的替代方案
由于svyciprop没有直接支持这两种方法,你可以通过拟合svyglm二项模型后手动转换得到近似效果:
# 拟合加权二项模型 glm_fit <- svyglm(y_bin ~ 1, design=wsvy, family=quasibinomial()) # 提取logit尺度的置信区间,转换为概率尺度 logit_ci <- confint(glm_fit) prob_ci <- plogis(logit_ci) names(prob_ci) <- c("2.5 %", "97.5 %") print(prob_ci)
内容的提问来源于stack exchange,提问作者k13
相关产品推荐
相关产品推荐

