得到一个子集错误 我两个月前在调查数据(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.
我试过运行将它设置为男性作为一个因素,并将两者都设置为因素。我得到了同样的错误。
从两个月前开始,我更新了 R
、Rstudio
以及 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_labelled
,haven_labelled
的子集运算符对其参数的 class 非常挑剔:它必须是普通整数或逻辑值,没有 class。
labelled
class 的帮助建议使用 haven::as_factor
或 haven::zap_labels
将这些标记的向量强制转换为标准 R class.
进一步更新:我为 haven
包提交了一个 github 问题,它已移至 vctrs
包,所以这个行为很可能会改变。
进一步更新:这个has been fixed在开发版vctrs
我重新 运行 脚本,该脚本在大约两个月前没有出现错误。
我使用避风港包上传(非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.
我试过运行将它设置为男性作为一个因素,并将两者都设置为因素。我得到了同样的错误。
从两个月前开始,我更新了 R
、Rstudio
以及 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_labelled
,haven_labelled
的子集运算符对其参数的 class 非常挑剔:它必须是普通整数或逻辑值,没有 class。
labelled
class 的帮助建议使用 haven::as_factor
或 haven::zap_labels
将这些标记的向量强制转换为标准 R class.
进一步更新:我为 haven
包提交了一个 github 问题,它已移至 vctrs
包,所以这个行为很可能会改变。
进一步更新:这个has been fixed在开发版vctrs