根据r中的条件提取模型

时间:2018-06-18 19:31:13

标签: r regression linear-regression

我使用pylr包运行了大约30,000个多元回归模型。

fit = plyr::dlply(data, "id", function(x) lm(t ~ d1 + d2 + d3, data = x))

我们拥有超过30,000个ID,因此它推出了超过30,000个型号。我无法逐一阅读模型。是否有任何有效的方法可以根据条件查看模型。我想根据

看模型
top 5 p-value (from the smallest)
top r squred
all the models with d3 significant

目前,我只能使用l_ply(fit, summary, .print = TRUE)

逐个查看模型

我尝试在tidy包中使用broom函数,以便将结果更改为清理格式,以便我可以导出.csv文件,但它不会运行。

test = broom::tidy(fit)

我收到了错误消息,告诉我Error in tidy.list(fit) : No tidying method recognized for this list

任何建议都将不胜感激!

以下是一些数据:

df <- data.frame(id=sample(LETTERS[1:10], replace= T, 10),
             d1=rnorm(20), d2=rnorm(20), d3=rnorm(20), t= rnorm(20), stringsAsFactors = F)

fit1 = plyr::dlply(df, "id", function(x) lm(t ~ d1 + d2 + d3, data = x))

2 个答案:

答案 0 :(得分:2)

这是提取3个最高R ^ 2模型的示例。

r2 = unlist(lapply(fit, function(x) summary(x)$r.squared))
fit[order(r2, decreasing = T)[1:3]]

其他人是分析性的:如果您希望按这些内容排名,请参阅此帖子https://stackoverflow.com/a/5587781/2761575了解如何提取p值

答案 1 :(得分:2)

这是一个基于Many Models article的工作流程,在嵌套数据帧上使用broom函数。请注意,我增加了数据框的大小,只是为了进行更多观察。

使用此方法,您可以按ID对数据进行分组,对其进行嵌套,并通过映射嵌套的数据来创建lm对象。 broom::glance为您提供模型的摘要输出:

library(tidyverse)
library(broom)

set.seed(124)
df <- data.frame(id=sample(LETTERS[1:10], size = 10, replace = T),
                 d1=rnorm(100), d2=rnorm(100), d3=rnorm(100), t= rnorm(100), stringsAsFactors = F)

models_df <- df %>%
  group_by(id) %>%
  nest() %>%
  mutate(mod = map(data, function(x) lm(t ~ d1 + d2 + d3, data = x))) %>%
  mutate(glance = map(mod, glance)) %>%
  unnest(glance)

models_df
#> # A tibble: 6 x 14
#>   id    data   mod   r.squared adj.r.squared sigma statistic p.value    df
#>   <chr> <list> <lis>     <dbl>         <dbl> <dbl>     <dbl>   <dbl> <int>
#> 1 A     <tibb… <S3:…    0.495         0.243  0.955     1.96   0.221      4
#> 2 E     <tibb… <S3:…    0.142        -0.0189 0.907     0.883  0.471      4
#> 3 F     <tibb… <S3:…    0.179         0.0247 1.05      1.16   0.355      4
#> 4 D     <tibb… <S3:…    0.818         0.727  0.522     8.97   0.0123     4
#> 5 C     <tibb… <S3:…    0.0514       -0.0580 0.994     0.470  0.706      4
#> 6 J     <tibb… <S3:…    0.202        -0.197  0.933     0.506  0.693      4
#> # ... with 5 more variables: logLik <dbl>, AIC <dbl>, BIC <dbl>,
#> #   deviance <dbl>, df.residual <int>

现在,您有了一个具有R统计(如R平方)的数据框,则可以使用dplyr之类的常规top_n命令来获得排名:

# smallest 5 p-value
models_df %>% top_n(-5, p.value)
#> # A tibble: 5 x 14
#>   id    data   mod   r.squared adj.r.squared sigma statistic p.value    df
#>   <chr> <list> <lis>     <dbl>         <dbl> <dbl>     <dbl>   <dbl> <int>
#> 1 A     <tibb… <S3:…     0.495        0.243  0.955     1.96   0.221      4
#> 2 E     <tibb… <S3:…     0.142       -0.0189 0.907     0.883  0.471      4
#> 3 F     <tibb… <S3:…     0.179        0.0247 1.05      1.16   0.355      4
#> 4 D     <tibb… <S3:…     0.818        0.727  0.522     8.97   0.0123     4
#> 5 J     <tibb… <S3:…     0.202       -0.197  0.933     0.506  0.693      4
#> # ... with 5 more variables: logLik <dbl>, AIC <dbl>, BIC <dbl>,
#> #   deviance <dbl>, df.residual <int>

# top r-sq
models_df %>% top_n(1, r.squared)
#> # A tibble: 1 x 14
#>   id    data   mod   r.squared adj.r.squared sigma statistic p.value    df
#>   <chr> <list> <lis>     <dbl>         <dbl> <dbl>     <dbl>   <dbl> <int>
#> 1 D     <tibb… <S3:…     0.818         0.727 0.522      8.97  0.0123     4
#> # ... with 5 more variables: logLik <dbl>, AIC <dbl>, BIC <dbl>,
#> #   deviance <dbl>, df.residual <int>

对于重要的d3项,我回到模型数据框架并在模型中映射了broom::tidy,这为每个项提供了摘要统计信息,然后进行过滤以研究d3

# significant d3--assuming alpha = 0.05
models_df %>%
  mutate(tidied = map(mod, tidy)) %>%
  unnest(tidied, .drop = T) %>%
  filter(term == "d3") %>%
  filter(p.value < 0.05)
#> # A tibble: 1 x 17
#>   id    r.squared adj.r.squared sigma statistic p.value    df logLik   AIC
#>   <chr>     <dbl>         <dbl> <dbl>     <dbl>   <dbl> <int>  <dbl> <dbl>
#> 1 D         0.818         0.727 0.522      8.97  0.0123     4  -5.13  20.3
#> # ... with 8 more variables: BIC <dbl>, deviance <dbl>, df.residual <int>,
#> #   term <chr>, estimate <dbl>, std.error <dbl>, statistic1 <dbl>,
#> #   p.value1 <dbl>

reprex package(v0.2.0)于2018-06-20创建。