You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 21:05:09