使用循环时出现子集错误

Subset error when using a loop

我一直在用这个公式:

varlist <- c("A", "B")

for(i in c(1:2)) {
  print(varlist[i])
  print(summary(svyglm(as.formula(paste0(varlist[i], "~YEAR + REGION")), 
             design = subset(FEI.w, varlist[i] != "U"),
             family = quasibinomial)))

}

我有比 A 和 B 更多的变量,但我想使用 A 和 B 作为我的因变量在调查包中做一个 glm。

我 运行 遇到的问题是,当我对数据进行子集化以排除 A 和 B 中的未知值时,R 不会这样做,而是包括整个数据框。

任何关于为什么会发生这种情况以及如何解决这个问题的指示将不胜感激!

subset() 使用非标准评估,这意味着它将列名作为未引用的变量,例如

subset(mtcars, mpg == 21)
#>               mpg cyl disp  hp drat    wt  qsec vs am gear carb
#> Mazda RX4      21   6  160 110  3.9 2.620 16.46  0  1    4    4
#> Mazda RX4 Wag  21   6  160 110  3.9 2.875 17.02  0  1    4    4

subset(mtcars, "mpg" == 21)
#>  [1] mpg  cyl  disp hp   drat wt   qsec vs   am   gear carb
#> <0 rows> (or 0-length row.names)

您的 varlist[i] != "U" 比较文字字符串 "A""U" 并发现它们不相等。

您可以通过

解决这个问题
eval(parse(text = varlist[i])) != "U"

subset(mtcars, eval(parse(text="mpg")) == 21)
#>               mpg cyl disp  hp drat    wt  qsec vs am gear carb
#> Mazda RX4      21   6  160 110  3.9 2.620 16.46  0  1    4    4
#> Mazda RX4 Wag  21   6  160 110  3.9 2.875 17.02  0  1    4    4

但老话是这样说的:如果您使用的是 eval(parse(,那么可能出了问题。

svyglm 有一个子集参数,因此您不需要在设计对象上调用 subset。你应该像这样进行子集化:

library(survey)
data(api)

dstrat<-svydesign(id=~1,strata=~stype, weights=~pw, data=apistrat, fpc=~fpc)

rstrat<-as.svrepdesign(dstrat)

for (type in unique(apistrat$stype)) {
  print(summary(svyglm(api00~ell+meals+mobility, 
                       design = rstrat, 
                       subset = apistrat$stype==type)))
}