从线性模型或公式变量中提取完整案例/包含观测值

6
在运行完m1 <- lm(f1, data=DT)后,我想保存包含的观测值(类似于“obs <- complete.cases(m1)”但要有效),以便我可以在同一些观测值上运行第二次回归: m2 <- lm(f2, data=DT[obs])
或者,我想获得按公式对象定义的给定变量的完整观测值。考虑这个类似R的伪代码:
f1 <- as.formula("y ~ x1 + x2 + x3")
f2 <- as.formula("y ~ x1 + x2")
obs <- complete.cases(DT[,list(all.vars(f1)])
m2 <- lm(f2, data=DT[obs])

我该怎么做?在第一种情况下,lm已经隐式地完成了工作;我该如何提取它?在第二种情况下,all.vars返回一个字符向量;我该如何正确地创建一个非引用列表,以便DT(data.table)能够理解?


1
obs <- complete.cases(DT[, c(all.vars(f1)), with = FALSE]) - David Arenburg
这回答了我的问题。顺带一提,obs <- complete.cases(DT[, all.vars(f1), with = FALSE])也可以工作,因为all.vars返回一个字符向量。我确实尝试了with标志(list(f1),with=TRUE),但那不起作用。 - rjturn
因为listdata.table环境中执行非标准评估,这意味着它接收未引用的变量名。 - David Arenburg
2个回答

6
自从 data.table v1.9.5 以来,na.omit 函数拥有了一个 cols 参数。
na.omit(DT, cols = all.vars(f))

是的,我认为这也回答了我的问题,尽管我没有测试过。看起来更清晰。谢谢Arun。 - rjturn

0

假设您的lm()调用的na.action是默认的na.omit,为什么不直接在原始数据上调用na.omit呢?

# create some missing values
mtcars$disp <- ifelse(runif(nrow(mtcars)) > 0.8, NA, mtcars$disp)

# fit model
m1 <- lm(mpg ~ disp, data = mtcars)

na.omit(mtcars[ , c("mpg", "disp")])

请查看na.omit的帮助文件以获取替代方案。


感谢您的回复,但这并没有回答我的问题。na.omit(data[subset]) 等同于 data[complete.cases(data[subset])],也许更加简洁,但问题是如何通过公式(或通过 all.vars(f) 转换为字符向量)创建子集。 - rjturn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接