我有一个大数据集(〜60k行/观察值,〜200列/变量),并且使用lme4并使用一些变量运行了一系列广义线性混合模型(glmm)。使用的许多变量都有丢失的数据(我在适当的情况下使用插补或其他方法解决了很多丢失的数据,但是仍然有很多剩余),因此显然由于列表删除而从原始数据帧中排除了许多行。 / p>
我现在需要做一些描述性的统计工作(主要是频率,因为许多变量是序数/标称的)。
是否有一种简单的方法可以根据给定的glmms中包含哪些观察结果来对原始数据帧进行子集化?
调用模型中使用的数据很容易:
glmm1 <-glmer(y〜var1 + var2 + var5 + etc +(1 | var_level),数据= df1) df1_glmm1_subset <-glmm1 @ frame
但是,这仅返回模型中使用的变量。我也想对该模型中未包含的变量(例如var3和var4)执行描述性摘要。
我可以编写一个冗长且肮脏的子集,该子集将模型变量中的NA排除在外,但必须有一个基本函数或程序包,该函数或程序包可以让我通过glmm轻松快速地对df1进行子集化。
(很抱歉,如果已回答此问题,但我的搜索尝试只是促使我了解如何在lm调用中使用子集功能)
答案 0 :(得分:1)
我不知道如何使用内置功能来做到这一点,但是在modelvariables中选择包含NA的行是非常常见的任务。甚至可能有更简单的解决方案,但这是一个: 让我们开始定义一个数据框和一个公式对象。注意,前10个观察和最后10个观察包含模型变量中的缺失。另外,我将公式放入公式对象中,因此我们可以将其用于变量提取以及运行模型本身。
testDf <- data.frame(y = rnorm(100), x1 = c(rnorm(90), rep(NA, 10)),
x2 = c(rep(NA, 10), runif(90)), x3 = rnorm(100, 3),
var_level = rbinom(100, size = 3, prob = 0.5))
form <- y ~ x1 + x2 + (1|var_level)
现在注意:all.vars(form)
给出上面定义的公式中包含的所有变量。我们使用lapply
在is.na
的所有选定列上运行testDf
。结果列表由指示缺失值存在的逻辑向量组成。可以使用Reduce
函数和逻辑OR进行汇总。聚集是一个逻辑向量,指向至少一个模型变量中包含NA的所有行。因此,要选择其余部分,需要将其取反。这是在下一行中完成的。
testDf[!Reduce("|", lapply(testDf[all.vars(form)], is.na)), ]
看看行号,我们看到前10行和最后10行已被删除。