Cara meningkatkan waktu berjalan untuk imputasi data R MICE

9

Singkatnya pertanyaan saya: apakah ada metode untuk meningkatkan waktu berjalan R MICE (data imputasi)?

Saya bekerja dengan satu set data (30 variabel, 1,3 juta baris) yang berisi (secara acak) data yang hilang. Sekitar 8% dari pengamatan di sekitar 15 dari 30 variabel mengandung NAs. Untuk memasukkan data yang hilang, saya menjalankan fungsi MICE, bagian dari paket MICE .

Saya mengalami waktu berlari yang sangat lambat, bahkan pada subset (100.000 baris), dengan metode = "fastpmm" dan m = 1 dan berjalan selama sekitar 15 menit.

Apakah ada cara untuk meningkatkan waktu berjalan tanpa kehilangan terlalu banyak dalam kinerja? (mice.impute.mean cukup cepat, tetapi disertai dengan hilangnya informasi penting!).

Kode yang dapat direproduksi:

library(mice)
df <- data.frame(replicate(30,sample(c(NA,1:10),1000000,rep=TRUE)))
df <- data.frame(scale(df))

output <- mice(df, m=1, method = "fastpmm")
Dendrobat
sumber
1
Secara umum: apakah jenis pertanyaan ini sesuai untuk Cross Validated, atau lebih cocok untuk Stack Overflow?
Dendrobat
3
Itu mungkin panggilan penghakiman. Karena (sebagai prinsip umum) peningkatan paling substansial dalam waktu berjalan diperoleh dengan memahami algoritma yang mendasarinya, saya berharap peluang terbaik Anda untuk mendapatkan jawaban yang benar-benar efektif mungkin ada di sini, di komunitas di mana orang mungkin dapat menyarankan pendekatan alternatif . Jika Anda tidak mendapatkan jawaban yang memadai dalam satu atau dua hari, maka tandai saja pos ini untuk migrasi dan kami akan mengirimkannya ke SO (bersama dengan jawaban dan komentar yang mungkin telah dikumpulkannya sementara itu).
whuber
1
Anda dapat mengubah opsi 'fastppm' menjadi 'norm', ini akan menjadi lebih cepat
marc1s
1
Thx @ marc1s, yang meningkatkan banyak untuk dataset besar. Untuk kerangka data acak (seperti di atas) dengan 10.000 baris, metode "norma" sekitar 4 kali lebih cepat dari "fastpmm". Dengan 50.000 baris itu bahkan 12 kali lebih cepat. Oleh karena itu, keuntungan relatif dalam waktu berjalan meningkat dengan jumlah baris.
Dendrobat
1
Bergantung pada model yang akan Anda jalankan, mungkin lebih cepat untuk menggunakan estimasi kemungkinan maksimum (atau informasi lengkap kemungkinan maksimum), yang secara asimptotik setara dengan imputasi jika model tersebut ditentukan dengan benar. Inilah makalah yang saya terlibat, yang membandingkan metode yang berbeda: emeraldinsight.com/doi/abs/10.1108/JCP-02-2015-0007
Jeremy Miles

Jawaban:

4

Anda dapat menggunakan quickpred()dari micepaket menggunakan mana Anda dapat membatasi prediktor dengan menentukan mincor (korelasi minimum) dan minpuc (proporsi kasus yang dapat digunakan). Anda juga dapat menggunakan mengecualikan dan menyertakan parameter untuk mengontrol prediktor.

Aanish
sumber
2

Saya membuat pembungkus untuk micefungsi yang mencakup satu argumen tambahan droplist,, di mana Anda dapat melewatkan vektor karakter dari variabel prediktor yang tidak ingin Anda gunakan di sisi kanan rumus imputasi. Ini untuk kecepatan, karena saya menemukan bahwa variabel faktor dengan banyak level akan memperlambat imputasi secara signifikan . Saya tidak mengetahui quickpredfungsi yang dirujuk oleh @Aanish, dan mungkin Anda bisa menggunakan kedua konsep secara bersamaan.

Di bawah ini adalah fungsinya seperti yang muncul di paket glmmplus saya . Jika menurut Anda bermanfaat, saya dapat membuka permintaan tarik dalam micepaket yang sebenarnya .

ImputeData <- function(data, m = 10, maxit = 15, droplist = NULL) {
  if (length(intersect(names(data), droplist)) < length(droplist)) {
    stop("Droplist variables not found in data set")
  }
  predictorMatrix <- (1 - diag(1, ncol(data)))
  for (term in droplist) {
  drop.index <- which(names(data) == term)
    predictorMatrix[, drop.index] <- 0
  }
  mids.out <- mice(data, m = m, maxit = maxit,
                   predictorMatrix = predictorMatrix)
  return(mids.out)
}
Ben Ogorek
sumber