2010-04-10 11 views
26

Come ci si aspetterebbe da un DSL finalizzato alla analisi dei dati, R gestisce i dati mancanti/incompleti molto bene, per esempio:Gestione di dati mancanti/incompleti in R: c'è una funzione per mascherare ma non rimuovere NA?

Molte funzioni di ricerca hanno un na.rm flag che se impostato su TRUE , rimuovere le AN:

>>> v = mean(c(5, NA, 6, 12, NA, 87, 9, NA, 43, 67), na.rm=T) 
>>> v 
     (5, 6, 12, 87, 9, 43, 67) 

Ma se si vuole trattare con AN prima la chiamata di funzione, è necessario fare qualcosa di simile:

per rimuovere ogni 'NA' da un vettore:

vx = vx[!is.na(a)] 

per rimuovere ogni 'NA' da un vettore e sostituirlo w/a '0':

ifelse(is.na(vx), 0, vx) 

per rimuovere tutta ogni riga che contiene 'NA' da un frame di dati:

dfx = dfx[complete.cases(dfx),] 

Tutte queste funzioni permanentemente rimuovere 'NA' o righe con un 'NA' in esse.

A volte questo non è esattamente ciò che si desidera, tuttavia è possibile effettuare una copia del frame dei dati "NA" eliminata per il passaggio successivo nel flusso di lavoro, ma nei passaggi successivi si desidera spesso ripristinare tali righe (ad esempio , per calcolare una statistica basata su colonne per una colonna che ha righe mancanti causate da una chiamata precedente a 'casi completi', ma quella colonna non ha valori 'NA' in essa contenuti.

di essere il più chiaro possibile su ciò che sto cercando: python/NumPy ha una classe, mascherato serie, con una maschera metodo , che consente di nascondere --ma non remove-- NA durante una chiamata di funzione. Esiste una funzione analoga in R?

risposta

18

Esattamente cosa fare con i dati mancanti - che possono essere contrassegnati come NA se sappiamo che manca - potrebbe differire da un dominio all'altro.

Per fare un esempio relativi a serie storiche, in cui si consiglia di saltare, o compilare, o interpolare, o interpolare in modo diverso, ... è che appena il (molto utile e popolare) zoo ha tutte queste funzioni correlate a NA manipolazione:

zoo::na.approx zoo::na.locf  
zoo::na.spline zoo::na.trim  

permette di approssimare (utilizzando algoritmi differenti), riporto in avanti o indietro, utilizzare l'interpolazione spline o trim.

Un altro esempio potrebbero essere i numerosi pacchetti di imputazione mancanti su CRAN, che spesso forniscono soluzioni specifiche per il dominio. [Quindi se chiami R a DSL, cos'è questo? "Soluzioni specifiche per sottodominio per lingue specifiche di dominio" o SDSSFDSL? Piuttosto un boccone :)]

Ma per la tua domanda specifica: no, non sono a conoscenza di un flag a livello di bit in base R che consente di contrassegnare le osservazioni come 'da escludere'. Presumo che la maggior parte degli utenti R ricorrere a funzioni come na.omit() o utilizzare l'opzione na.rm=TRUE che hai citato.

+1

Il tuo link allo zoo è rotto. [Qui] (http://cran.r-project.org/web/packages/zoo/zoo.pdf) è un link alla documentazione più recente che ho trovato (.pdf warning), e [Here] (http://cran.r-project.org/web/packages/zoo/index.html) è un link a quello che penso sia l'ultimo riepilogo dello zoo. – deadstump

+1

Il plurale errato 's' in URL così come 'package = ...', non 'packages = ...'. Ora risolto, grazie. –

15

È una buona pratica esaminare i dati, quindi dedurre circa il tipo di valori mancanti: è MCAR (mancante completo e casuale), MAR (mancante a caso) o MNAR (mancante non a caso)? Sulla base di questi tre tipi, puoi studiare la struttura sottostante dei valori mancanti e concludere se l'imputazione è del tutto applicabile (sei fortunato se non è MNAR, perché, in quel caso, i valori mancanti sono considerati non ignorabili e sono in relazione ad un'influenza sottostante, fattore, processo, variabile ... qualsiasi cosa sia sconosciuta).

Capitolo 3. in "Interactive e Dynamic Graphics per Data Analyst con R e GGobi" da Di Cook e Deborah Swayne è grande riferimento per quanto riguarda questo argomento.

Vedrete il pacchetto norm in azione in questo capitolo, ma il pacchetto Hmisc ha routine di imputazione dei dati. Vedere anche Amelia, cat (per l'attribuzione delle missioni categoriali), mi, mitools, VIM, vmv (per la visualizzazione dei dati mancanti).

Onestamente, non riesco ancora a capire la tua domanda sulle statistiche o sulle funzionalità di imputazione dei dati mancanti di R? Suppongo di aver fornito buoni riferimenti sul secondo e sul primo: puoi sostituire i tuoi NA con tendenza centrale (media, mediana o simile), quindi ridurre la variabilità, o con costante casuale "tirata fuori" di casi osservati (registrati), o puoi applicare l'analisi di regressione con variabili che contengono NA come criteri, e altre variabili come predittori, quindi assegnare residui a NA ... è un modo elegante per trattare con NA, ma molto spesso non lo farebbe vai facilmente sulla tua CPU (ho Celeron a 1.1GHz, quindi devo essere gentile).

Questo è un problema di ottimizzazione ... non esiste una risposta definitiva, è necessario decidere cosa/perché si attacca con un metodo. Ma è sempre una buona pratica guardare i dati! =) Assicuratevi di controllare Cook & Swayne - è una guida eccellente, abilmente scritta. "Modelli lineari con R" di Faraway contiene anche un capitolo sui valori mancanti.

Quindi lì.

Buona fortuna! =)

8

La funzione na.exclude() suona come quello che si desidera, anche se è solo un'opzione per alcune (importanti) funzioni.

Nel contesto di raccordo e di lavoro con modelli, R ha una famiglia di funzioni generiche per trattare con AN: na.fail(), na.pass(), na.omit() e na.exclude(). Questi sono, a loro volta, argomenti per alcune delle funzioni di modellazione chiave di R, come ad esempio lm(), glm() e nls(), nonché funzioni in pacchetti MASS, rpart e di sopravvivenza.

Tutte e quattro le funzioni generiche funzionano come filtri. na.fail() passerà i dati solo se non ci sono NA, altrimenti fallisce. na.pass() passa tutti i casi. na.omit() e na.exclude() elimineranno entrambi i casi con NA e passeranno gli altri casi. Ma na.exclude() ha un attributo diverso che indica alle funzioni che elaborano l'oggetto risultante di prendere in considerazione le NA. Potresti vedere questo attributo se hai fatto attributes(na.exclude(some_data_frame)).Ecco una dimostrazione di come na.exclude() altera il comportamento di predict() nel contesto di un modello lineare.

fakedata <- data.frame(x = c(1, 2, 3, 4), y = c(0, 10, NA, 40)) 

## We can tell the modeling function how to handle the NAs 
r_omitted <- lm(x~y, na.action="na.omit", data=fakedata) 
r_excluded <- lm(x~y, na.action="na.exclude", data=fakedata) 

predict(r_omitted) 
#  1  2  4 
# 1.115385 1.846154 4.038462 
predict(r_excluded) 
#  1  2  3  4 
# 1.115385 1.846154  NA 4.038462 

tuo na.action di default, tra l'altro, è determinato dalla options("na.action") e inizia come na.omit() ma è possibile impostarlo.