rompere dataframe in sottoinsiemi dai valori del fattore, di invio di funzione che restituisce GLM di classe, come ricombinare?
Domanda
Grazie a pacchetto plyr di Hadley ddply funzionano possiamo prendere un dataframe, scomposizione in subdataframes da fattori, inviare ogni a una funzione, e quindi combinare i risultati di funzione per ogni subdataframe in un nuovo dataframe.
Ma cosa succede se la funzione restituisce un oggetto di una classe come glm o nel mio caso, un c ( "GLM", "LM"). Quindi, questi non possono essere combinati in un dataframe possono? Ottengo questo errore al posto
Error in as.data.frame.default(x[[i]], optional = TRUE, stringsAsFactors = stringsAsFactors) : cannot coerce class 'c("glm", "lm")' into a data.frame
C'è una struttura dati più flessibile che ospiterà tutte le complesse risultati di classe glm delle mie chiamate di funzione, conservando le informazioni riguardanti i sottoinsiemi dataframe?
O questo dovrebbe essere fatto in un modo completamente diverso?
Soluzione
Proprio per espandere il mio commento: plyr
è un insieme di funzioni per combinare ingresso ed il tipo di output. Quindi, quando si funzione restituisce qualcosa inconvertibile per data.frame
si dovrebbe usare list
come output. Così, invece di utilizzare l'uso ddply
dlply
.
Quando si vuole fare qualcosa su ogni modello e convertire i risultati di data.frame
poi ldply
è la chiave.
Consente di creare dei modelli che utilizzano dlply
list_of_models <- dlply(warpbreaks, .(tension), function(X) lm(breaks~wool, data=X))
str(list_of_models, 1)
# List of 3
# $ L:List of 13
# ..- attr(*, "class")= chr "lm"
# $ M:List of 13
# ..- attr(*, "class")= chr "lm"
# $ H:List of 13
# ..- attr(*, "class")= chr "lm"
# - attr(*, "split_type")= chr "data.frame"
# - attr(*, "split_labels")='data.frame': 3 obs. of 1 variable:
Si dà list
di tre modelli lm
.
Utilizzando ldply
è possibile creare una data.frame
, per esempio
-
con le previsioni di ogni modello:
ldply(list_of_models, function(model) { data.frame(fit=predict(model, warpbreaks)) }) # tension fit # 1 L 44.5556 # 2 L 44.5556 # 3 L 44.5556
-
con le statistiche per ogni modello:
ldply(list_of_models, function(model) { c( aic = extractAIC(model), deviance = deviance(model), logLik = logLik(model), confint = confint(model), coef = coef(model) ) }) # tension aic1 aic2 deviance logLik confint1 confint2 confint3 confint4 coef.(Intercept) coef.woolB # 1 L 2 98.3291 3397.78 -72.7054 34.2580 -30.89623 54.8531 -1.77044 44.5556 -16.33333 # 2 M 2 81.1948 1311.56 -64.1383 17.6022 -4.27003 30.3978 13.82559 24.0000 4.77778 # 3 H 2 76.9457 1035.78 -62.0137 18.8701 -13.81829 30.2411 2.26273 24.5556 -5.77778