2016-08-10 2 views
4

Nachdem ich mehr in den Tidyverse gelesen hatte, begann ich mit der Anpassung vieler linearer Modelle auf einmal, wie in this beschrieben. Das heißt, würde ich etwas in diese Richtung tun:dplyr und tidyr - Berechnen vieler linearer Modelle auf einmal mit den Faktoren

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)) 

Das Problem ist, dass dieser Ansatz schlägt fehl, wenn die Variablen nicht vom gleichen Typ sind, zum Beispiel, wenn ein numerischen ist und man ist ein Faktor, da die gather() Funktion wird den gesamten value Vektor in einen Faktor zwingen. Zum Beispiel

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) 

wird durch die Warnung gefolgt

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

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

und die value Spalte ist ein Zeichen, so dass der Trick mit nest() funktioniert nicht mehr, da alle Kovariaten als Faktoren setzen in werden .

Ich frage mich, ob es eine ordentliche Weise, dies zu tun ist.

Antwort

3

Sie könnten die Typen beim Anpassen des Modells konvertieren, obwohl Sie vorsichtig vorgehen sollten, wie in den Kommentaren angegeben, da dies unbeabsichtigte Folgen haben könnte.

Wenn Sie noch konvertieren möchten, können Sie type_convert von readr auf den gesamten Rahmen oder type.convert verwenden Sie einfach auf den „Wert“ Vektor.

Mit type_convert:

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

Mit type.convert:

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

Entweder von diesen als Teil der Kette führen zu dem gewünschten Ergebnis für diesen Fall:

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

Kluger Ansatz. +1 –

+2

Wird scheitern, wenn Sie zufällig numerische Variablen haben, die dennoch als Faktoren behandelt werden sollen (vielleicht keine gute Idee, aber es passiert viel). 'Sammeln' wird unweigerlich (?) verlieren einige Informationen ... –

Verwandte Themen