r语言 - 使用循环时的子集错误



我一直在用这个公式:

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)))
}

最新更新