2016-08-10 5 views
4

より多くを読み込んだ後に、thisで説明されているように、多くの線形モデルを同時にフィットさせ始めました。 1が数値であり、1が要因であるときに問題がgather()関数として、変数は例えば、同じタイプでないときに、このアプローチが失敗したということですdplyrとtidyr - 多くの線形モデルを一度に因子数で計算する

library(dplyr) 
library(tidyr) 
library(purrr) 
df <- data.frame(y = rnorm(10), 
       x1 = runif(10), 
       x2 = runif(10)) 

df %>% 
    gather(covariate, value, x1:x2) %>% 
    group_by(covariate) %>% 
    nest() %>% 
    mutate(model = map(.x = data , .f = ~lm(y ~ value, data = .))) %>% 
    mutate(rsquared = map_dbl(.x = model, .f = ~summary(.)$r.squared)) 

:つまり、私はこれらの線に沿って何かをするだろうファクターにvalueベクトル全体を強制するでしょう。例えば、

df <- data.frame(y = rnorm(10), 
       x1 = runif(10), 
       x3 = sample(c("a", "b", "c"), 10, replace = TRUE)) 

df %>% 
    gather(covariate, value, x1:x3) %>% 
    sapply(class) 

は警告

Warning message: 
attributes are not identical across measure variables; they will be dropped 

      y covariate  value 
    "numeric" "character" "character" 

が続いているとvalue列は文字なので、すべての共変量は因子として入れられるようにnest()とのトリックはもはや機能しません。

これは、整頓方法があるかどうか疑問に思っています。

答えて

3

モデルにフィッティングするときにタイプを変換することができますが、意図しない結果が生じる可能性があるため、コメントで指摘されているように注意してください。

あなたはまだ変換したい場合は、あなただけの「価値」ベクター上にフレーム全体またはtype.convertに readr からtype_convertを使用することができます。

mutate(model = map(.x = data , .f = ~lm(y ~ value, data = readr::type_convert(.)))) 

type.convertを使用する:type_convertを使用

df %>% 
    gather(covariate, value, x1:x3) %>% 
    group_by(covariate) %>% 
    nest() %>% 
    mutate(model = map(.x = data , .f = ~lm(y ~ type.convert(value), data = .))) %>% 
    mutate(rsquared = map_dbl(.x = model, .f = ~summary(.)$r.squared)) 

# A tibble: 2 x 4 
    covariate    data model rsquared 
     <chr>   <list> <list>  <dbl> 
1  x1 <tibble [10 x 2]> <S3: lm> 0.33176960 
2  x3 <tibble [10 x 2]> <S3: lm> 0.06150498 
+0

賢いアプローチ:

mutate(model = map(.x = data , .f = ~lm(y ~ type.convert(value), data = .))) 

これらのいずれかの鎖リードの一部として、この場合の望ましい結果です。 +1 –

+2

それでもやはり要因のように扱われるはずの数値的に見える変数がある場合には失敗します(多分いい考えではないかもしれませんが、多くは起こります)。 'gathering 'は必然的に(?)いくつかの情報を失うことになる... –

関連する問題