首页 > 解决方案 > R:如何基于回归模型(glmm)对数据框进行子集化

问题描述

我有一个大型数据集(~60k 行/观察,~200 列/变量),并使用 lme4 使用一些变量运行了一系列广义线性混合模型(glmm)。使用的许多变量都有缺失数据(我已经在适当的情况下使用插补或其他方法计算了大部分缺失数据,但仍然有很多),因此很明显,由于列表删除,许多行被排除在原始数据框中。

我现在需要做一些描述性的统计工作(主要是由于许多变量是序数/名义的频率)。

有没有一种简单的方法可以根据我给定的 glmms 中包含的观察结果对原始数据框进行子集化?

调用模型中使用的数据很容易:

glmm1 <- glmer(y~ var1 + var2 + var5 + etc + (1|var_level), data = df1) df1_glmm1_subset<-glmm1@frame

但是,这只返回模型中使用的变量。我也想对该模型中未包含的变量(例如 var3 和 var4)进行描述性总结。

我可以编写一个从模型变量中排除 NA 的又长又脏的子集,但我认为必须有一个基本函数或包允许我通过 glmm 快速轻松地对 df1 进行子集。

(抱歉,如果这个问题已经得到解答,但我的搜索尝试只是让我了解如何在 lm 调用中使用子集功能)

标签: rregressionsubsetmixed-models

解决方案


我不知道如何使用内置功能来做到这一点,但是在模型变量中选择包含 NA 的行是很常见的任务。可能还有更简单的解决方案,但这是一个:让我们从定义数据框和公式对象开始。请注意,第一个和最后 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运行。结果列表由指示缺失值存在的逻辑向量组成。它可以使用函数和逻辑 OR 进行聚合。聚合是一个逻辑向量,指向至少一个模型变量中包含 NA 的所有行。因此,要选择余数,它需要被否定。这是在以下行中完成的。is.natestDfReduce

testDf[!Reduce("|", lapply(testDf[all.vars(form)], is.na)), ]

查看行号,我们看到前 10 行和最后 10 行已被删除。


推荐阅读