2017-08-04 56 views
0

我想運行lm模型並保存模型比較結果並提取p值。我想將所有信息保存在數據框中。 使用鑽石的數據集爲例:運行多個模型並將數據框中的模型比較結果保存在r中

diamonds %>% 
    group_by(cut) %>% 
    do(model1 = lm(price~carat, data=.), 
     model2 = lm(price~carat+depth, data=.)) %>% 
    mutate(anova = anova(model2,model1)) %>% 
    mutate(pval= anova$'Pr(>F'[2]) 

我得到以下錯誤信息:

Error in mutate_impl(.data, dots) : 
    Column `anova` must be length 1 (the group size), not 6 

我的問題是:

  1. 爲什麼我得到的錯誤信息以及如何保存方差分析結果在數據框中?
  2. 如果lm或anova在某些子集上不起作用,如何使整個過程正常工作?像try..catch ..

我的真實數據是這樣更復雜。只需使用鑽石和線性模型來說明這個想法。 非常感謝。

+0

類的對象'從類anova'繼承'data.frame'。他們有6列,因爲dfs是'list'類的對象的特例,'length(anova(m1,m2))'的值是6. –

+0

@ Rui Barradas謝謝。那麼怎樣才能將anova結果保存在數據框中,就像其他模型結果一樣? – zesla

+0

您可以使數據框列包含任何種類的對象,包括類data.frame的對象。但你真的需要這一切嗎?例如,你會重複'F'統計量,因爲你也保留了''Pr(> F)'[2]'(你的代碼中有一個錯字,btw)。我相信你應該將'anova'結果保存在一個列表中,而不是保存在原始數據框'diamonds'中。 –

回答

2

這是tidyr::nest()功能與purrrbroom的結合非常好的應用。你所做的是: - 分組數據框 - 應用模型mutate(mod = map(data, model) - 使用broom::tidy() 概括模型 - 提取相關的統計數據。

如需更多關於這個這裏是一個偉大的談話由哈德利關於這個問題:https://www.youtube.com/watch?v=rz3_FDVt9eg

在你的情況下,我認爲你可以做這樣的事情:

library(tidyverse) 
library(broom) 
diamonds %>% 
     group_by(cut) %>% 
      nest() %>% 
      mutate(
       model1 = map(data, ~lm(price~carat, data=.)), 
       model2 = map(data, ~lm(price~carat+depth, data=.)) 
      ) %>% 
      mutate(anova = map2(model1, model2, ~anova(.x,.y))) %>% 
     mutate(tidy_anova = map(anova, broom::tidy)) %>% 
     mutate(p_val = map_dbl(tidy_anova, ~.$p.value[2])) %>% 
     select(p_val) 
+0

太棒了!謝謝! – zesla

相關問題