当前位置: 首页 > 知识库问答 >
问题:

如何使用broom和DPLYR将分组数据应用于分组模型?

上官华池
2023-03-14

我想在mtcars数据集中做类似于将gpm(加仑每英里=1/mpg)模型与wt的拟合。这似乎很容易:

data(mtcars)
library(dplyr)
library(tidyr)
library(broom)
library(ggplot2)
library(scales)

mtcars2 <-
    mtcars %>%
    mutate(gpm = 1 / mpg) %>%
    group_by(cyl, am)

lm1 <-
    mtcars2 %>%
    do(fit = lm(gpm ~ wt, data = .))

这就得到了一个有6行的行数据帧,正如预期的那样。

这张图确认了六组:

p1 <-
    qplot(wt, gpm, data = mtcars2) +
    facet_grid(cyl ~ am) +
    stat_smooth(method='lm',se=FALSE, fullrange = TRUE) +
    scale_x_continuous(limits = c(0,NA)) 

我可以使用augment()获得匹配的输出:

lm1 %>% augment(fit)
newdata <-
    mtcars2 %>%
    mutate(
        wt = wt + cyl/4)
pred1 <-
    lm1 %>%
    augment(
        fit,
        newdata = newdata)

从其他地方的阅读中,我发现group_by和rowwise数据帧不兼容,因此lm1未分组,augment不能关联models和newdata。是否有另一种设计模式可以让我这样做?如果它像上面的尝试一样简单透明就好了,但更重要的是它能工作。

下面是我的sessionInfo():

> sessionInfo()
R version 3.3.1 (2016-06-21)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 7 x64 (build 7601) Service Pack 1

locale:
[1] LC_COLLATE=English_United States.1252 
[2] LC_CTYPE=English_United States.1252   
[3] LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C                          
[5] LC_TIME=English_United States.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] scales_0.4.0  ggplot2_2.1.0 broom_0.4.1   tidyr_0.6.0   dplyr_0.5.0  

loaded via a namespace (and not attached):
 [1] Rcpp_0.12.7      magrittr_1.5     mnormt_1.5-4     munsell_0.4.3   
 [5] colorspace_1.2-6 lattice_0.20-34  R6_2.1.3         stringr_1.1.0   
 [9] plyr_1.8.4       tools_3.3.1      parallel_3.3.1   grid_3.3.1      
[13] nlme_3.1-128     gtable_0.2.0     psych_1.6.9      DBI_0.5-1       
[17] lazyeval_0.2.0   assertthat_0.1   tibble_1.2       reshape2_1.4.1  
[21] labeling_0.3     stringi_1.1.1    compiler_3.3.1   foreign_0.8-67  

编辑:

newdata %>% 
dplyr::select(cyl, am, wt) %>% # wt holds new predictor values
group_by(cyl, am) %>%
nest() %>%
inner_join(regressions, .) %>% 
## looks like yours at this point
mutate(pred = list(augment(fit, newdata = data))) %>% # Error here
unnest(pred)

我认为不同之处在于,我在这个示例中有3个(ID...类似于mtcars中的行名)x2(cyl)x2(am)单位(每个示例有12个测量值),而mtcars示例中有3个(cyl)x2(am)单元格x每个单元格的car类型的随机数。在我的分析中,我需要查看ID值,但newdata同样适用于所有单元。如果它有帮助,就把它想象成在测试中施加在每辆车上的逆风的速度。这是否说明了Augment抱怨它不能处理类列表数据的原因?

编辑:将ID与newdata合并(使用full=true)解决了最后一个问题。我目前正在使用您的第一个建议解决方案。

共有1个答案

柴昆杰
2023-03-14

对于这种情况,我使用了purrr包中的map2map2同时在两个列表的元素中循环。列表的长度和顺序必须相同。

列表的元素用作要应用的某些函数的参数(在您的示例中为augment)。在这里,您的两个列表是模型列表和数据集列表(每个cyl/am组合都有一个列表)。

使用map2_df将结果作为data.frame而不是列表返回。

library(purrr)

我使用split列出了要预测的Data.Frames列表。要拆分的因子的顺序决定了列表顺序,因此我确保它与lm1的顺序相同。

test_split = split(newdata, list(newdata$am, newdata$cyl)

map2_df(lm1$fit, test_split, ~augment(.x, newdata = .y))

为了避免如此担心顺序问题,您可以按组嵌套预测数据,将其加入LM1中,并将augment的结果作为列表返回,以便取消嵌套。

newdata %>%
    group_by(cyl, am) %>%
    nest() %>%
    inner_join(lm1, .) %>%
    mutate(pred = list(augment(fit, newdata = data))) %>%
    unnest(pred)
 类似资料:
  • 我试过了 但这行不通。在我最初的方法中,我通过将每周编号1-4的dataframe与我的rawdata文件合并来解决这个问题。这样,我每篇文章有4周的时间(行),但是使用for循环的实现效率非常低,所以我试图用dplyr(或任何其他更高效的包/函数)做同样的事情。任何建议都将不胜感激!

  • 问题内容: 我有一个pandas数据框,其中包含一个名为string的列。我想计算每个字符串的出现次数,然后将计数的数量除以所有计数的总和。我正在像这样在Pandas中尝试这样做: 此代码引发错误,“ DataFrame对象没有属性” size”。如何在Pandas中应用函数进行计算? 问题答案: 使用一个函数将其应用于 每个 值(而不是序列),并接受kwargs。因此,值没有方法。 也许这会工作

  • 问题内容: 我有一个包含其他对象列表的对象,并且我想返回由容器的某些属性映射的所包含对象的平面图。如果可以仅使用stream和lambdas的话吗? 让我们假设一个操作列表: 结果将是实物 但我想把它弄平 问题答案: 您可以尝试类似:

  • 问题内容: 我有一个电子邮件数组(可以是1封电子邮件,也可以是100封电子邮件),我需要用ajax请求发送该数组(我知道该怎么做),但是我只能发送一个包含以下内容的数组不超过10封电子邮件。因此,如果原始阵列中包含20封电子邮件,我将需要将其拆分为2个阵列,每组10个。或者,如果原始数组中有15封电子邮件,那么1数组中的10封电子邮件,以及另一个数组中的5封电子邮件。我使用的是jQuery,哪种方

  • 我正在尝试使用 JOLT 根据属性将数组拆分为多个数组。我已经尝试过 JOLT“移位”规范,但无法实现。 我已经查看了几个完成数组转换的链接,但是我找不到任何将数组拆分成多个数组的方法。 示例:根据属性“type”的值将以下数组转换为3个数组。 输入: 输出: