【问题标题】:R: How to subset a dataframe based on a regression model (glmm)R:如何基于回归模型(glmm)对数据框进行子集化
【发布时间】:2019-11-02 11:17:29
【问题描述】:

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

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

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

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

glmm1

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

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

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

【问题讨论】:

    标签: r regression subset mixed-models


    【解决方案1】:

    我不知道如何使用内置功能来做到这一点,但是在模型变量中选择包含 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) 给出了上面定义的公式中包含的所有变量。我们使用lapplytestDf 的所有选定列上运行is.na。结果列表由指示缺失值存在的逻辑向量组成。它可以使用Reduce 函数和逻辑或来聚合。聚合是一个逻辑向量,指向至少一个模型变量中包含 NA 的所有行。因此,要选择余数,它需要被否定。这是在以下行中完成的。

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

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

    【讨论】:

    • 谢谢!这很好用!对于后人我会提到:因为我已经生成了模型,所以我在 lapply 代码中使用 glmm1@call$formula 而不是 form (减少了我环境中的对象数量,并允许快速更改我必须为每个模型的代码执行此操作。
    猜你喜欢
    • 2016-12-16
    • 1970-01-01
    • 2014-11-13
    • 1970-01-01
    • 2020-04-27
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多