問題

group_byの後のすべてのグループに対して線形回帰を行い、モデル係数をリスト列に保存し、 'unnest'を使用してリスト列を展開します。 ここでは、mtcarsデータセットを例として使用します。

注:do' here, because house :: tidy 'を使用したいすべてのモデルでは機能しません。

 mtcars %>% group_by(cyl) %>% 
    do(model=lm(mpg~wt+hp, data=.)) %>% 
    mutate(coefs = list(summary(model)$coefficients)) %>% 
    unnest()
 

私はこのようなものが欲しい。

 cyl   term         Estimate Std. Error   t value     Pr(>|t|)
 4     (Intercept) 36.9083305 2.19079864 16.846975 1.620660e-16
 4     wt         -2.2646936 0.57588924 -3.932516 4.803752e-04
 4     hp          -0.0191217 0.01500073 -1.274718 2.125285e-01
 6.......
 6......
........
 

私は以下のようなエラーがあります:

 Error: All nested columns must have the same number of elements.
 

誰もこの問題を解決するのを助けることができますか?私は何度も試した後にそれを理解することができませんでした...

  ベストアンサー

1つのオプションは、 'coefs'列(.$coefs)を抽出し、list列の名前を 'cyl'列で設定し、listmapでループし、data.frameに変換し、行名に基づいて新しい列を作成し、.idを使用してlistnamesから 'cyl'列を作成します。

 library(tidyverse)
mtcars %>% 
   group_by(cyl) %>% 
   do(model=lm(mpg~ wt + hp, data=.)) %>% 
   mutate(coefs = list(summary(model)$coefficients)) %>%
                 select(-model) %>% 
   {set_names(.$coefs, .$cyl)} %>%
   map_df(~ .x %>% 
               as.data.frame %>%
               rownames_to_column('term'), .id = 'cyl')
# cyl        term    Estimate Std. Error   t value     Pr(>|t|)
#1   4 (Intercept) 45.83607319 4.78693568  9.575243 1.172558e-05
#2   4          wt -5.11506233 1.60247105 -3.191984 1.276524e-02
#3   4          hp -0.09052672 0.04359827 -2.076383 7.151610e-02
#4   6 (Intercept) 32.56630096 5.57482132  5.841676 4.281411e-03
#5   6          wt -3.24294031 1.37365306 -2.360815 7.759393e-02
#6   6          hp -0.02219994 0.02017664 -1.100279 3.329754e-01
#7   8 (Intercept) 26.66393686 3.66217797  7.280896 1.580743e-05
#8   8          wt -2.17626765 0.72094143 -3.018647 1.168393e-02
#9   8          hp -0.01367295 0.01073989 -1.273099 2.292303e-01
 

tidyを使用したい場合は、map_dfの内容を

        ...                %>%
        map_df(~ .x %>% 
                          broom::tidy(.), .id = 'cyl')
 

また、もう1つのオプションは、group_byの後にnestを適用し、modelオブジェクトにbroom::tidyを適用し、次にunnest

 mtcars %>% 
   group_by(cyl) %>%
   nest %>% 
   mutate(data = map(data, ~ .x %>%
                    summarise(model = list(broom::tidy(lm(mpg ~ wt + hp)))))) %>% 
   unnest %>% 
   unnest
 

  同じタグがついた質問を見る

rdplyrtidyverse