得到一个子集错误 我两个月前在调查数据(SPSS 数据集)上 运行 逻辑回归 (svyglm) 时没有得到

Getting a subset error I did not get two months ago when running logistic regression (svyglm) on survey data (SPSS dataset)

我重新 运行 脚本,该脚本在大约两个月前没有出现错误。

我使用避风港包上传(非public和专有)SPSS dataset和调查包来分析复杂的调查数据。

然而,现在,当我 运行 即使是一个简单的逻辑回归,其中两个变量都是虚拟变量(编码 0 表示否,编码 1 表示是)...类似这样...

f <- read_sav("~/data.sav")
fsd <- svydesign(ids=~1, data=f, weights=~f$weight)
model <- svyglm(exclhlth~male,design=fsd,family=quasibinomial())

...我收到以下错误:

Error: Must subset elements with a valid subscript vector.
x Subscript has the wrong type `omit`.
ℹ It must be logical, numeric, or character.
Run `rlang::last_error()` to see where the error occurred.
> rlang::last_error()
<error/vctrs_error_subscript_type>
Must subset elements with a valid subscript vector.
x Subscript has the wrong type `omit`.
ℹ It must be logical, numeric, or character.
Backtrace:
 1. survey::svyglm(exclhlth ~ male, design = fsd, family = quasibinomial())
 2. survey:::svyglm.survey.design(...)
 4. survey:::`[.survey.design2`(design, -nas, )
 5. base::`[.data.frame`(x$variables, i, ..1, drop = FALSE)
 7. vctrs:::`[.vctrs_vctr`(xj, i)
 8. vctrs:::vec_index(x, i, ...)
 9. vctrs::vec_slice(x, i)
Run `rlang::last_trace()` to see the full context.

我试过运行将它设置为男性作为一个因素,并将两者都设置为因素。我得到了同样的错误。

从两个月前开始,我更新了 RRstudio 以及 haven 和 survey 包。所以,我猜有些事情发生了变化,但我不确定该怎么做。

我去年年底才开始从 SPSS 过渡到 R,所以我提前感谢您的任何指导,并为新手的错误提前道歉!

好的,您的问题似乎是 RStudio 数据导入函数正在创建劫持下标 ([) 操作的 classes。这以前发生过,当 RStudio 从创建 data.frame 切换到 tbl 对象时,但是在调用 svydesign().

之前使用 as.data.frame() 就足够了

survey 包的新版本可用之前,您可以尝试使用 foreign::read.spss 而不是 haven::read_sav 吗?

(此外,如果您能想出一个不太机密的示例并将其发送给维护者,我相信他会很感激。)

更新:问题是 na.omit 的输出有 class omit,一些变量有 class haven_labelledhaven_labelled 的子集运算符对其参数的 class 非常挑剔:它必须是普通整数或逻辑值,没有 class。

labelled class 的帮助建议使用 haven::as_factorhaven::zap_labels 将这些标记的向量强制转换为标准 R class.

进一步更新:我为 haven 包提交了一个 github 问题,它已移至 vctrs 包,所以这个行为很可能会改变。

进一步更新:这个has been fixed在开发版vctrs