Come vengono trattati i valori "NA" in glm in R


19

Ho una tabella di dati T1, che contiene quasi un migliaio di variabili (V1) e circa 200 milioni di punti dati. I dati sono scarsi e la maggior parte delle voci sono NA. Ciascun punto dati ha un ID univoco e una coppia di date per distinguere da un altro.

Ho un'altra tabella T2, che contiene un insieme separato di variabili (V2). Questa tabella ha anche coppie id e date che identificano in modo univoco le voci in T2.

Sospettiamo che i dati in T1 possano essere utilizzati per prevedere i valori delle variabili in T2.

Per dimostrarlo, ho pensato di applicare il modello 'glm' in R e verificare se possiamo davvero trovare qualche variabile in T2 che dipende dalle variabili in T1.

Per ogni variabile in T2, ho iniziato a estrarre tutti i dati in T1 con lo stesso ID e coppia di date che hanno portato a punti di dati ~ 50K molto più piccoli per alcune delle variabili di test.

I problemi che sto affrontando ora con l'applicazione di glm sono i seguenti.

  1. In alcuni casi, mi mostra un errore 'fit not found' e avvertimento 'glm.fit: l'algoritmo non converge'. Non sono sicuro del perché sia ​​mostrato?

  2. Come vengono trattati gli NA in glm? Rimuove prima tutti i record che coinvolgono "NA" e quindi esegue il fitting?

  3. È una buona strategia rimuovere prima tutte le NA e poi chiamare "glm". Temo che ciò possa ridurre significativamente i punti di riferimento dato che la maggior parte di essi è NA.

  4. Quale metodo viene utilizzato per calcolare i coefficienti. Non sono riuscito a trovare alcun sito Web o documento o libro che discuti su come viene calcolato l'output.

Ho testato glm con e senza "NA" e ho trovato risposte diverse su quali punti vengono considerati i NA mentre si adattano i dati:

Esempio 1:

> tmpData
  x1 x2 x3        Y
1  1  1  1        3
2  1  0  4        5
3  1  2  3        6
4  0  3  1        4

Call:  glm(formula = as.formula(paste(dep, " ~ ", paste(xn, collapse = "+"))), 
    na.action = na.exclude)

Coefficients:
                      (Intercept)  as.numeric(unlist(tmpData["x1"]))  as.numeric(unlist(tmpData["x2"]))  
                        5.551e-16                          1.000e+00                          1.000e+00  
as.numeric(unlist(tmpData["x3"]))  
                        1.000e+00  

Degrees of Freedom: 3 Total (i.e. Null);  0 Residual
Null Deviance:      5 
Residual Deviance: 9.861e-31    AIC: -260.6 

Esempio 2:

'x1'    'x2'    'x3'    'Y'
100000  1   NA  2
1   1   1   3
1   NA  -1124   2
1   0   4   5
1   2   3   6
0   3   1   4



Coefficients:
                      (Intercept)  as.numeric(unlist(tmpData["x1"]))  as.numeric(unlist(tmpData["x2"]))  as.numeric(unlist(tmpData["x3"]))  
                       -2.3749044                         -0.0000625                          0.6249899                          1.8749937  

Degrees of Freedom: 5 Total (i.e. Null);  2 Residual
Null Deviance:      13.33 
Residual Deviance: 1.875    AIC: 20.05 

Risposte:


27

Gestione NA: puoi controllare come glm gestisce i dati mancanti. glm () ha un argomento na.actionche indica quale delle seguenti funzioni generiche dovrebbe essere usata da glm per gestire NA nei dati:

  • na.omite na.exclude: le osservazioni vengono rimosse se contengono valori mancanti; se si utilizza na.exclude alcune funzioni riempiranno i residui e le previsioni della lunghezza corretta inserendo NA per i casi omessi.
  • na.pass: conserva tutti i dati, inclusi gli NA
  • na.fail: restituisce l'oggetto solo se non contiene valori mancanti

Se non imposti na.action, glm () controllerà le opzioni globali di R per vedere se lì è impostato un valore predefinito. Puoi accedere alle tue opzioni con getOption("na.action")o options("na.action")e puoi impostarlo con, ad esempio, options(na.action = "na.omit") Tuttavia, dall'output R che fornisci nell'esempio 1, sembra che tu stia impostando na.action = na.omit. Quindi, sì, almeno in quel caso, stai rimuovendo tutti i casi / righe con NA prima del montaggio. Inoltre, sono abbastanza sicuro na.action = na.passche glm () fallirebbe quando i dati hanno NA (provalo).

Errori: glm () sta usando una procedura iterativa (minimi quadrati iterati ponderati; IWLS) per effettuare stime della massima verosimiglianza. A volte ricevi errori perché passerà solo attraverso un numero predefinito di iterazioni e, se non si adatta bene, si arrende. Questo numero è controllato dall'argomento maxit, che per impostazione predefinita è maxit = 25. Potresti provare a impostarlo più in alto, anche se ovviamente ci vorrà più tempo. (Se impostato trace=TRUE, mostrerà il risultato di ogni iterazione.)

Altre fonti di informazione: il file di aiuto per glm è accessibile con ?glmo help(glm)e spiega gran parte di ciò. Altre due risorse utili sono:

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.