Come eseguire l'imputazione dei valori in un numero molto elevato di punti dati?


12

Ho un set di dati molto grande e mancano circa il 5% di valori casuali. Queste variabili sono correlate tra loro. Il seguente set di dati R è solo un esempio di giocattolo con dati correlati fittizi.

set.seed(123)

# matrix of X variable 
xmat <- matrix(sample(-1:1, 2000000, replace = TRUE), ncol = 10000)
colnames(xmat) <- paste ("M", 1:10000, sep ="")
rownames(xmat) <- paste("sample", 1:200, sep = "")
#M variables are correlated 

N <- 2000000*0.05 # 5% random missing values 
inds <- round ( runif(N, 1, length(xmat)) )
xmat[inds] <- NA 
> xmat[1:10,1:10]
         M1 M2 M3 M4 M5 M6 M7 M8 M9 M10
sample1  -1 -1  1 NA  0 -1  1 -1  0  -1
sample2   1  1 -1  1  0  0  1 -1 -1   1
sample3   0  0  1 -1 -1 -1  0 -1 -1  -1
sample4   1  0  0 -1 -1  1  1  0  1   1
sample5  NA  0  0 -1 -1  1  0 NA  1  NA
sample6  -1  1  0  1  1  0  1  1 -1  -1
sample7  NA  0  1 -1  0  1 -1  0  1  NA
sample8   1 -1 -1  1  0 -1 -1  1 -1   0
sample9   0 -1  0 -1  1 -1  1 NA  0   1
sample10  0 -1  1  0  1  0  0  1 NA   0

Esiste un modo (migliore) per imputare i valori mancanti in questa situazione? L'algoritmo Random Forest è utile? Qualsiasi soluzione di lavoro in R sarebbe molto apprezzata.

modifiche:

(1) I valori mancanti sono distribuiti casualmente tra le variabili e i campioni. Il numero di variabili è molto grande (qui nell'esempio - 10000), mentre il numero di campioni è piccolo qui nell'esempio fittizio sopra è di circa 200. Quindi quando osserviamo qualsiasi campione su tutte le variabili (10000), ci sono alte probabilità che manchi un valore in alcune variabili, a causa dell'elevato numero di variabili. Quindi solo eliminare l'esempio non è un'opzione.

(2) La variabile può essere trattata sia come quantitativa che qualitativa (binaria) nel processo di imputazione. L'unico giudizio è quanto bene possiamo prevederlo (accuratezza). Quindi previsioni come 0,98 invece di 1 potrebbero essere accettabili piuttosto che 0 contro 1 o -1 contro 1. Potrei aver bisogno di un compromesso tra tempo di calcolo e precisione.

(3) Il problema che sto pensando è che il sovradimensionamento può influire sui risultati poiché il numero di variabili è elevato rispetto al numero di campioni.

(4) Poiché la quantità totale di valori mancanti è di circa il 5% ed è casuale (non concentrata in nessuna variabile o campione come precauzione è stata presa per rimuovere le variabili o i campioni che hanno valori mancanti molto alti)

(5) Rendere i dati completi per l'analisi è il primo obiettivo e l'accuratezza è secondaria. Quindi non troppo sensibile alla precisione.

r  random-forest  missing-data  data-imputation  multiple-imputation  large-data  definition  moving-window  self-study  categorical-data  econometrics  standard-error  regression-coefficients  normal-distribution  pdf  lognormal  regression  python  scikit-learn  interpolation  r  self-study  poisson-distribution  chi-squared  matlab  matrix  r  modeling  multinomial  mlogit  choice  monte-carlo  indicator-function  r  aic  garch  likelihood  r  regression  repeated-measures  simulation  multilevel-analysis  chi-squared  expected-value  multinomial  yates-correction  classification  regression  self-study  repeated-measures  references  residuals  confidence-interval  bootstrap  normality-assumption  resampling  entropy  cauchy  clustering  k-means  r  clustering  categorical-data  continuous-data  r  hypothesis-testing  nonparametric  probability  bayesian  pdf  distributions  exponential  repeated-measures  random-effects-model  non-independent  regression  error  regression-to-the-mean  correlation  group-differences  post-hoc  neural-networks  r  time-series  t-test  p-value  normalization  probability  moments  mgf  time-series  model  seasonality  r  anova  generalized-linear-model  proportion  percentage  nonparametric  ranks  weighted-regression  variogram  classification  neural-networks  fuzzy  variance  dimensionality-reduction  confidence-interval  proportion  z-test  r  self-study  pdf 

1
Il motivo per cui mancano i dati dipende fortemente dalla scelta della tecnica appropriata. Ad esempio, se i dati mancano completamente in modo casuale, perderai poco facendo cadere tutti i casi con valori mancanti (poiché il set di dati è grande e mancano relativamente pochi valori); ma se la mancanza è correlata a variabili importanti nell'analisi, l'eliminazione di questi casi può introdurre una distorsione.
whuber

1
@whuber Sono d'accordo, non è possibile rimuovere un set di dati di queste dimensioni poiché ogni caso avrà un valore mancante almeno in una variabile. Ciò causerà la perdita totale dei dati.
Giovanni,

4
Ciò cambia sostanzialmente la domanda, John, perché nella sua forma attuale afferma esplicitamente il contrario: afferma che manca solo il 5% dei valori. Anche se comprendiamo il 5% da applicare a tutte le voci nella matrice dei dati, piuttosto che il 5% dei casi, chiunque prenda l'esempio come indicativo della natura dei dati concluderebbe validamente che non più del 10 * 5% = 50 % dei casi ha valori mancanti. Le tre cose che sono più importanti da descrivere in tali domande sono (1) lo scopo dell'analisi, (2) la natura della mancanza e (3) la quantità di mancanza.
whuber

Risposte:


8

Esistono due modi per affrontare il problema delle variabili grandi e dei piccoli campioni (osservazione), a seconda della situazione e del set di dati.

(1) basta usare i campioni (osservazioni) come variabile a condizione che i punteggi tra le variabili siano uguali o normalizzati.

(2) Usa le variabili come variabile ma esegui un campionamento casuale mentre imputi in modo che la variabile numerica sia inferiore al numero di campioni e infine unisci i dati.

Quello che segue è l'allenamento, è possibile adattarsi alle proprie esigenze. Suppongo che la variabile sia continua ma l'allenamento è simile per le variabili discrete. Qui sto dando un piccolo esempio per un controllo rapido.

In primo luogo, per l'allenamento che genera dati correlati, qui le osservazioni (campioni) sono correlate, possono essere realistiche in situazioni in cui le variabili sono considerate indipendenti mentre le osservazioni sono correlate. Ma in altre situazioni in cui sia osservazioni che variabili sono correlate.

# example correlated data, correlated by observations 
# number of observations 
nobs = 200
nvars = 100
# number of variables 
# covariance matrix matrixCR to create correlated data 
matrixCR <- matrix(NA, nrow = nobs, ncol = nobs)
diag(matrixCR) <- 1
matrixCR[upper.tri (matrixCR, diag = FALSE)] <- 0.5
matrixCR[lower.tri (matrixCR, diag = FALSE)] <- 0.5
matrixCR[1:10,1:10]
L = chol(matrixCR)# Cholesky decomposition
nvars = dim(L)[1]
set.seed(123)
rM = t(L) %*% matrix(rnorm(nvars*nobs), nrow=nvars, ncol=nobs)
rownames(rM) <- paste("V", 1:nvars, sep = "") 
colnames(rM) <- paste("O", 1:nobs, sep = "")
rM[1:10,1:10]



# introduce missing values in random places 
N <- round(nobs*nvars*0.05,0) # 5% random missing values 
set.seed(123)
inds <- round ( runif(N, 1, length(rM)) )
rM1 <- rM
rM1[inds] <- NA

Sto usando il missForestpacchetto per l'imputazione, che dipende dal randomForestpacchetto per farlo. È possibile eseguire il calcolo parallelo se si dispone di un numero molto elevato di punti dati da imputare.

# now use the rM1 matrix in imputation. 
require(missForest)
out.m <- missForest(rM1, maxiter = 10, ntree = 300)
# imputed 
imp.rM1 <- out.m$ximp

Dato che si tratta di un set di dati simulato, abbiamo il lusso di stimare l'accuratezza dell'imputazione confrontando l'originale prima dei valori mancanti introdotti con l'imputato.

# actual values that were made missing 
aval <- rM[inds]
impv <- imp.rM1[inds]

# accuracy - defined as correlation between actual (before na introduction) and imputed values 
cor(aval,impv)
[1] 0.6759404

È possibile aggirare per aumentare la precisione. In bocca al lupo !


5

Esistono libri completi di imputazione dei dati, quindi è difficile dare una risposta in questo quadro.

yx

y=f(x)

Se il tuo set di dati è molto grande, assicurati di utilizzare un algoritmo veloce o uno scalabile.


grazie, hai qualche suggerimento?
Giovanni,

niente in particolare. ma se
imputi i

Comunque, se mancano solo pochi valori, puoi semplicemente rimuovere tutta la linea. Dai tuoi set di dati
Donbeo,

3
Sebbene sia sempre possibile eliminare solo i casi con valori mancanti, a volte questa sarebbe una scelta errata, a seconda del motivo per cui mancano i dati.
whuber

@whuber Sono totalmente d'accordo con te, ma molte volte questa è solo la scelta più sicura.
Donbeo,

5

Questa è una domanda davvero interessante. Sto anche cercando la stessa cosa. In realtà, ci sono molti modi diversi per affrontarlo.

La prima cosa, a mio avviso, sarà determinare quale tipo di dati mancanti hai: mancare completamente a caso (MCAR), mancare a caso (MAR) o mancare non a caso (NMAR). Ciò è difficile e controverso da dimostrare, ma questo documento mostra un modo interessante di esaminare i dati MAR.

Per gestire l'imputazione multipla R ha alcuni pacchetti:

  • MICE (che sembra molto usato),
  • randomForest,
  • Hmisc
  • Amelia
  • mi

Questi sono solo alcuni dei pacchetti che ho trovato finora.

MICE ha anche implementato la foresta casuale e alcuni altri metodi, come la corrispondenza media predittiva.

Questo non è molto, ma può aiutarti a capire alcune cose. Non appena avrò dei risultati o deciderò con quale metodo procederò, modificherò il post.

In bocca al lupo!


I miei dati sono MCAR.
Giovanni,

1
Se i tuoi dati sono MCAR, puoi utilizzare solo l'analisi completa dei casi. Molti articoli riportano che l'utilizzo dell'analisi completa dei casi con i dati MCAR è la soluzione migliore. Almeno, alcuni degli articoli che ho trovato riportano questo, anche se confrontati con altri metodi di imputazione
psoares,

3

Domanda interessante. Il trucco di questo è che, al fine di eseguire un'imputazione multipla, hai bisogno di qualcosa di più di un semplice modello predittivo (che potrebbe / sarebbe facile ottenere, per esempio, in un approccio di apprendimento automatico). Chiameremo questi modelli simulando modelli, dal momento che non sono modelli di probabilità.

p

  1. Identificare tutti i modelli di mancanza
  2. Per ogni modello, utilizzare un approccio di selezione delle caratteristiche bayesiane per assegnare pesi posteriori per completare i casi nei dati.
  3. Campionare casualmente casi completi in modo iterativo per generare frame di dati completi.

3

Il tuo problema sembra fatto su misura per una sorta di completamento di matrice di basso rango. Prova a usare la impute.svd()funzione dal bcvpacchetto . Suggerirei di usare un piccolo rango (l'argomento k) - qualcosa come 5.

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.