我使用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))
答案 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创建。