2017-02-07 9 views
0

私はいくつかの回帰モデルを実行しており、結果をデータフレームに収めたいと考えています。私は失敗したいくつかの方法を試しました。回帰サマリー結果をデータフレームに入れるR

# Generate some fake data: three responses and eight covariates 
df <- data.frame(y1 = rnorm(50), y2 = rnorm(50), y3 = rnorm(50), 
       aa = rnorm(50), ab = rnorm(50), ca = rnorm(50), 
       cd = rpois(50, 30), v8 = runif(50)) 

# Create a vector of covariate names 
xs <- c("aa","ab", "ca","cd","v8") 
# Initialize a list whose length is that of the vector xs 
rl1 <- vector('list', 5) 
rl2 <- vector('list', 5) 
rl3 <- vector('list', 5) 

for(i in 1:5) { fm1<- as.formula(paste('y1', xs[i], sep = '~')) 
fm2 <- as.formula(paste('y2', xs[i], sep = '~')) 
fm3 <- as.formula(paste('y3', xs[i], sep = '~')) 
rl1[[i]] <- summary(lm(fm1, data = df)) 
rl2[[i]] <- summary(lm(fm2, data = df)) 
rl3[[i]] <- summary(lm(fm3, data = df)) 
} 

rl1 
rl2 

### 
#The goal is to: 
#create a data frame for results that looks like this 

Variable t value  Pr(>|t|)   
aa  -1.032  0.3070 
ab  -0.121  0.9043 
ca  0.041  0.967 
cd  0.429  0.670 
v8  -1.204  0.2346 

and create a data frame for results that looks like this 
Variable rl1.t value r2.t value 
aa  -1.032  -1.846 
ab  -0.121  -0.230 
ca  0.041  1.347 
cd  0.429  0.211 
v8  -1.204  0.214 

は最後に、私はこの方法で回帰を実行するには、このコードに出くわしたと私は信用を与えると私はソースを覚えていませんが、感謝を言いたいです。

+0

'broom'パッケージから' tidy'関数をチェックしてください。 – eipi10

答えて

1

多くのパッケージ(dplyrtidyrpurrrbroom)を使用しています。これらのパッケージはすべてtidyverseメタパッケージにある便利な場所にあり、これらのパッケージをすべてインストールするのに役立ちます。

tidyverseパッケージには、整然としたデータときちんとしたデータツールに基づいたワークフローがあります。あなたはそれについての詳細を読むことができますhere

あなたの例で、tidyverseパッケージを使用すると、以下の通りです:この例では

library(tidyverse) 
library(broom) # is part of the tidyverse but has to be attached on its own. 

df <- data.frame(y1 = rnorm(50), y2 = rnorm(50), y3 = rnorm(50), 
       aa = rnorm(50), ab = rnorm(50), ca = rnorm(50), 
       cd = rpois(50, 30), v8 = runif(50)) 

xs <- c("aa","ab", "ca","cd","v8") 

results <- tibble(covariates = xs, data = list(df)) %>% 
     mutate(fm1 = map2(data, covariates, ~lm(as.formula(paste('y1', .y, sep = '~')),data = .x)), 
       fm2 = map2(data, covariates, ~lm(as.formula(paste('y2', .y, sep = '~')),data = .x)), 
       fm3 = map2(data, covariates, ~lm(as.formula(paste('y3', .y, sep = '~')),data = .x))) %>% 
     gather(model, result, fm1:fm3) %>% 
     mutate(stats = map(result, tidy)) 


results %>% 
    select(-data, -result) %>% 
    spread(model, stats) %>% 
    unnest(.sep = "_") 

# A tibble: 10 × 16 
    covariates fm1_term fm1_estimate fm1_std.error fm1_statistic fm1_p.value fm2_term fm2_estimate 
     <chr>  <chr>  <dbl>   <dbl>   <dbl>  <dbl>  <chr>  <dbl> 
1   aa (Intercept) 0.186250282 0.10901934  1.7084150 0.09401936 (Intercept) -0.13702761 
2   aa   aa -0.122391949 0.09736266 -1.2570727 0.21480983   aa 0.07086972 
3   ab (Intercept) 0.235819869 0.11000625  2.1436951 0.03715205 (Intercept) -0.07707552 
4   ab   ab 0.210060898 0.11165387  1.8813580 0.06599560   ab 0.26121398 
5   ca (Intercept) 0.192849006 0.11315134  1.7043458 0.09478244 (Intercept) -0.13487163 
6   ca   ca 0.028244577 0.11597189  0.2435467 0.80861978   ca 0.01340660 
7   cd (Intercept) 0.336090343 0.67322033  0.4992279 0.61989940 (Intercept) -1.50990351 
8   cd   cd -0.004866459 0.02170098 -0.2242506 0.82351414   cd 0.04484769 
9   v8 (Intercept) 0.037664728 0.18697545  0.2014421 0.84120415 (Intercept) 0.12866580 
10   v8   v8 0.353757262 0.35827371  0.9873939 0.32840091   v8 -0.62992103 
# ... with 8 more variables: fm2_std.error <dbl>, fm2_statistic <dbl>, fm2_p.value <dbl>, fm3_term <chr>, 
# fm3_estimate <dbl>, fm3_std.error <dbl>, fm3_statistic <dbl>, fm3_p.value <dbl> 

手順は次のようになります。あなたの共変量の名前と巣各共変量のデータのtibbleを作成

  1. 各共変量に対してfm1〜fm3のモデルを別々のリスト列として作成し、線形モデルを各部分にマッピングします。
  2. 長い形式(キーと値のペア)に変更する
  3. 統計列を作成し、broom::tidyを結果列にマッピングして整理します。 tibble

  • ストアその全部次に、あなたがunnestを使用して必要なものを取得し、あなたがdplyrtidyrを経由して欲しいものにそれを操作するためresults tibbleを使用することができます。

  • +0

    私は提供されたコードをコピーして貼り付けました。あなたの投稿とは結果が異なります。つまり、私の最後では動作しませんでした。さらに、私のデータでコードを実行しようとすると、rに致命的な実行時エラーが発生し、セッションが終了します。どんな新しいアイデアも大いに評価されます。ありがとうございます –

    +0

    ランダム変数を使用しているので結果が異なりますし、分析前に 'set.seed()'を使用しませんでした。致命的なエラーに関しては、自分のデータの問題を診断またはデバッグすることはできません。コードをステップバイステップで実行し、エラーを見つけて問題を解決してください。 –

    関連する問題