Bagaimana cara melakukan imputasi nilai dalam jumlah poin data yang sangat besar?

12

Saya memiliki dataset yang sangat besar dan sekitar 5% nilai acak hilang. Variabel-variabel ini berkorelasi satu sama lain. Contoh berikut dataset R hanyalah contoh mainan dengan data berkorelasi dummy.

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

Apakah ada cara (terbaik) untuk menyalahkan nilai yang hilang dalam situasi ini? Apakah algoritma Random Forest bermanfaat? Solusi kerja apa pun di R akan sangat dihargai.

Suntingan:

(1) Hilang nilai didistribusikan secara acak antara variabel dan samples.As jumlah variabel adalah sangat besar (di sini dalam contoh - 10000), sedangkan jumlah sampel kecil di sini di contoh boneka di atas itu adalah sekitar 200. Jadi, ketika kita melihat sampel apa pun dari semua variabel (10000), ada kemungkinan besar bahwa akan ada nilai yang hilang pada beberapa variabel - karena sejumlah besar variabel. Jadi hanya menghapus sampel bukan pilihan.

(2) Variabel dapat diperlakukan baik secara kuantitatif atau kualitatif (biner) dalam proses imputasi. Satu-satunya penilaian adalah seberapa baik kita dapat memperkirakannya (akurasi). Jadi prediksi seperti 0,98 bukannya 1 mungkin bisa diterima daripada 0 vs 1 atau -1 vs 1. Saya mungkin perlu tradeoff antara waktu komputasi dan akurasi.

(3) Masalah yang saya pikirkan bagaimana overfitting dapat mempengaruhi hasil karena jumlah variabel besar dibandingkan dengan jumlah sampel.

(4) Karena jumlah total nilai yang hilang adalah sekitar 5% dan acak (tidak terkonsentrasi dalam variabel atau sampel apa pun karena tindakan pencegahan diambil untuk menghapus variabel atau sampel yang memiliki nilai hilang yang sangat tinggi)

(5) Membuat data lengkap untuk analisis adalah tujuan pertama dan akurasi kedua. Jadi tidak terlalu peka terhadap keakuratan.

John
sumber
1
Alasan mengapa data hilang sangat bergantung pada pilihan teknik yang tepat. Misalnya, jika data hilang sepenuhnya secara acak, Anda akan kehilangan sedikit dengan menjatuhkan semua kasus dengan nilai yang hilang (karena dataset besar dan nilai yang relatif sedikit hilang); tetapi jika ketiadaan terkait dengan variabel penting dalam analisis, menjatuhkan kasus-kasus tersebut dapat menimbulkan bias.
whuber
1
@whuber Saya setuju, tidak mungkin untuk menghapus dataset sebesar ini karena setiap kasus akan memiliki nilai yang hilang setidaknya pada satu variabel. Ini akan menyebabkan total kehilangan data.
John
4
Itu mengubah pertanyaan secara substansial, John, karena dalam bentuk saat ini secara eksplisit menyatakan sebaliknya: ia menegaskan bahwa hanya 5% dari nilai yang hilang. Bahkan jika kita memahami 5% untuk diterapkan pada semua entri dalam matriks data, daripada 5% dari kasus, siapa pun yang mengambil contoh sebagai indikasi sifat data Anda akan secara sah menyimpulkan bahwa tidak lebih dari 10 * 5% = 50 % dari kasus memiliki nilai yang hilang. Tiga hal yang paling penting untuk diuraikan dalam pertanyaan-pertanyaan tersebut adalah (1) tujuan analisis, (2) sifat dari ketiadaan, dan (3) jumlah ketiadaan.
whuber

Jawaban:

8

Ada dua cara untuk menangani masalah variabel besar dan sampel kecil (pengamatan), tergantung pada situasi dan dataset Anda.

(1) cukup gunakan sampel (pengamatan) sebagai variabel asalkan skor seluruh variabel sama atau dinormalisasi.

(2) Gunakan variabel sebagai variabel tetapi lakukan beberapa pengambilan sampel secara acak sambil menghitung sehingga jumlah variabel kurang dari jumlah sampel dan akhirnya menggabungkan data.

Berikut ini adalah latihan, Anda dapat menyesuaikan dengan kebutuhan Anda. Saya memiliki asumsi variabel kontinu tetapi Anda berolahraga serupa untuk variabel diskrit. Di sini saya memberikan contoh kecil untuk pemeriksaan cepat.

Pertama, untuk latihan menghasilkan data berkorelasi, di sini pengamatan (sampel) berkorelasi, mungkin realistis dalam situasi dimana variabel diasumsikan independen sedangkan pengamatan berkorelasi. Tetapi dalam situasi lain di mana kedua observasi dan variabel berkorelasi.

# 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

Saya menggunakan missForestpaket untuk imputasi, yang tergantung pada randomForestpaket untuk melakukannya. Anda dapat melakukan komputasi paralel jika Anda memiliki jumlah besar poin data untuk menyalahkan.

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

Karena ini adalah set data yang disimulasikan, kita memiliki kemewahan memperkirakan keakuratan imputasi dengan membandingkan yang asli sebelum nilai-nilai yang hilang diperkenalkan dengan imputasi.

# 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

Anda dapat bekerja untuk meningkatkan akurasi. Semoga berhasil !

Ram Sharma
sumber
5

Ada buku lengkap tentang imputasi data sehingga sulit untuk memberikan jawaban dalam kerangka ini.

Hal termudah untuk dilakukan dalam hal ini adalah memilih salah satu kolom ( ) dan mengumpulkan yang lain dalam matriks .xyx

Model dilatih dan nilai yang hilang diganti dengan nilai yang diprediksi oleh model kami. Data Anda tampaknya kategorikal sehingga hutan acak bisa menjadi pilihan yang baik.y=f(x)

Jika dataset Anda sangat besar, pastikan untuk menggunakan algoritma cepat atau yang terukur.

Donbeo
sumber
terima kasih, Apakah Anda punya saran buku?
John
tidak ada yang khusus. tetapi jika Anda memasukkan data Google, Anda dapat menemukan banyak hal
Donbeo
Pokoknya jika hanya beberapa nilai yang hilang Anda bisa menghapus semua baris. Dari kumpulan data Anda
Donbeo
3
Meskipun Anda selalu dapat menghapus kasus dengan nilai yang hilang, itu kadang-kadang merupakan pilihan yang buruk, tergantung pada mengapa data tersebut hilang.
whuber
@whuber Saya sangat setuju dengan Anda tetapi seringkali ini adalah pilihan yang lebih aman.
Donbeo
5

Ini pertanyaan yang sangat menarik. Saya juga mencari hal yang sama. Sebenarnya, ada banyak cara berbeda untuk menghadapinya.

Hal pertama, menurut saya, adalah menentukan jenis data apa yang Anda miliki - hilang secara acak (MCAR), hilang secara acak (MAR), atau hilang tidak secara acak (NMAR). Ini sulit dan kontroversial untuk dibuktikan tetapi makalah ini menunjukkan cara yang menarik untuk melihat data MAR.

Untuk menangani beberapa imputasi, R memiliki beberapa paket:

  • MICE (yang tampaknya sangat digunakan),
  • randomForest,
  • Hmisc
  • Amelia
  • mi

Ini hanya beberapa paket yang saya temukan sejauh ini.

MICE juga telah menerapkan hutan acak dan beberapa metode lain, seperti pencocokan rata-rata prediktif.

Ini tidak banyak tetapi dapat membantu Anda mengetahui beberapa hal. Segera setelah saya mendapatkan hasil atau memutuskan metode mana yang akan saya gunakan, saya akan mengedit posting.

Semoga berhasil!

psoares
sumber
Data saya adalah MCAR.
John
1
Jika data Anda MCAR, Anda hanya dapat menggunakan analisis kasus lengkap. Banyak makalah melaporkan bahwa menggunakan analisis kasus lengkap dengan data MCAR adalah solusi terbaik. Setidaknya, beberapa makalah yang saya temukan melaporkan ini, bahkan ketika membandingkan dengan metode imputasi lainnya
psoares
3

Pertanyaan menarik. Trik untuk ini adalah bahwa, untuk melakukan beberapa imputasi, Anda memerlukan lebih dari sekedar model prediksi (yang bisa / akan mudah diperoleh dalam, katakanlah, pendekatan pembelajaran mesin). Kami akan menyebut model ini model simulasi, karena mereka tidak cukup model probabilitas.

Aspek gabungan dari pemilihan fitur (big ) dan pelatihan model simulasi membuat saya berpikir bahwa pendekatan Bayesian adalah yang terbaik. Itu juga berarti bahwa tidak ada pendekatan yang jelas untuk ini. Bagi saya pendekatan terbaik akan memiliki pendekatan berikut:p

  1. Identifikasi semua pola ketiadaan
  2. Untuk setiap pola, gunakan pendekatan pemilihan fitur Bayesian untuk menetapkan bobot posterior untuk menyelesaikan kasus dalam data.
  3. Sampel acak kasus lengkap secara iteratif untuk menghasilkan bingkai data lengkap.
AdamO
sumber
3

Masalah Anda tampaknya dibuat khusus untuk semacam penyelesaian matriks peringkat rendah. Coba gunakan impute.svd()fungsi dari bcvpaket . Saya menyarankan menggunakan peringkat kecil (argumen k) - sekitar 5.

Innuo
sumber