dplyr中的回归输出

时间:2015-11-25 20:36:01

标签: r regression dplyr

我想定义类似于'扫帚中的功能。封装

library(dplyr)
library(broom)

mtcars %>% 
  group_by(am) %>% 
  do(model = lm(mpg ~ wt, .)) %>% 
  glance(model)

工作正常。但是我如何定义像

这样的自定义函数
myglance <- function(x, ...) {
  s <- summary(x)
  ret <- with(s, data.frame(r2=adj.r.squared, a=coefficients[1], b=coefficients[2]))
  ret
}


mtcars %>% 
  group_by(am) %>% 
  do(model = lm(mpg ~ wt, .)) %>% 
  myglance(model)

eval中的错误(替换(expr),数据,enclos = parent.frame()):   无效&#39; envir&#39;类型&#39;

的参数

2 个答案:

答案 0 :(得分:3)

glance以这种方式工作,因为扫帚包为行方向数据帧here定义了一种方法。如果您愿意引入整个.R文件(以及here中的col_name实用程序),您可以使用我的代码执行相同的操作:

myglance_df <- wrap_rowwise_df(wrap_rowwise_df_(myglance))

mtcars %>% 
  group_by(am) %>% 
  do(model = lm(mpg ~ wt, .)) %>% 
  myglance_df(model)

还有一种解决方法,不需要从扫帚中添加如此多的代码:更改每个模型的,并定义自己的 em>在该班上一瞥功能。

glance.mylm <- function(x, ...) {
  s <- summary(x)
  ret <- with(s, data.frame(r2=adj.r.squared, a=coefficients[1], b=coefficients[2]))
  ret
}

mtcars %>% 
  group_by(am) %>% 
  do(model = lm(mpg ~ wt, .)) %>% 
  mutate(model = list(structure(model, class = c("mylm", class(model))))) %>%
  glance(model)

最后,您还可以选择立即在模型上执行myglance

mtcars %>% 
  group_by(am) %>% 
  do(myglance(lm(mpg ~ wt, .)))

答案 1 :(得分:1)

以下是我对它如何工作的看法,基本上方法是:

  1. 从数据框中提取相应的列(我的解决方案基于this answer必须是更好的方式,我希望有人会纠正我!

  2. 对结果运行lapply,并在上面的myglance函数中构建所需的变量。

  3. 使用do.call运行rbind以返回data.frame

  4. myglance <- function(df, ...) {
      # step 1
      s <- collect(select(df, ...))[[1]] # based on this answer: https://stackoverflow.com/a/21629102/1992167
    
      # step 2
      lapply(s, function(x) {
        data.frame(r2 = summary(x)$adj.r.squared,
                   a = summary(x)$coefficients[1],
                   b = summary(x)$coefficients[2])
      }) %>% do.call(rbind, .) # step 3
    }
    

    输出:

    > mtcars %>% 
    +   group_by(am) %>% 
    +   do(model = lm(mpg ~ wt, .)) %>%
    +   myglance(model)
             r2        a         b
    1 0.5651357 31.41606 -3.785908
    2 0.8103194 46.29448 -9.084268