rompere dataframe in sottoinsiemi dai valori del fattore, di invio di funzione che restituisce GLM di classe, come ricombinare?

StackOverflow https://stackoverflow.com/questions/2970443

  •  24-10-2019
  •  | 
  •  

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?

È stato utile?

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
    
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top