Saya ingin menggunakan imputasi untuk mengganti nilai yang hilang dalam kumpulan data saya di bawah batasan tertentu.
Sebagai contoh, saya ingin variabel yang diperhitungkan x1
menjadi lebih besar atau sama dengan jumlah dari dua variabel saya yang lain, katakan x2
dan x3
. Saya juga ingin x3
diperhitungkan oleh salah satu 0
atau >= 14
dan saya ingin x2
diperhitungkan oleh salah satu 0
atau >= 16
.
Saya mencoba mendefinisikan batasan ini dalam SPSS untuk beberapa imputasi, tetapi dalam SPSS saya hanya dapat menentukan nilai maksimum dan minimum. Apakah ada cara untuk mendefinisikan kendala lebih lanjut dalam SPSS atau Anda tahu paket R yang akan membiarkan saya mendefinisikan kendala tersebut untuk penghilangan nilai yang hilang?
Data saya adalah sebagai berikut:
x1 =c(21, 50, 31, 15, 36, 82, 14, 14, 19, 18, 16, 36, 583, NA,NA,NA, 50, 52, 26, 24)
x2 = c(0, NA, 18,0, 19, 0, NA, 0, 0, 0, 0, 0, 0,NA,NA, NA, 22, NA, 0, 0)
x3 = c(0, 0, 0, 0, 0, 54, 0 ,0, 0, 0, 0, 0, 0, NA, NA, NA, NA, 0, 0, 0)
dat=data.frame(x1=x1, x2=x2, x3=x3)
> dat
x1 x2 x3
1 21 0 0
2 50 NA 0
3 31 18 0
4 15 0 0
5 36 19 0
6 82 0 54
7 14 NA 0
8 14 0 0
9 19 0 0
10 18 0 0
11 16 0 0
12 36 0 0
13 583 0 0
14 NA NA NA
15 NA NA NA
16 NA NA NA
17 50 22 NA
18 52 NA 0
19 26 0 0
20 24 0 0
0 or 16 or >= 16
untuk0 or >= 16
sejak>=16
meliputi nilai16
. Semoga itu tidak mengacaukan arti Anda. Sama untuk0 or 14 or >= 14
Jawaban:
Salah satu solusinya adalah menulis fungsi imputasi kustom Anda sendiri untuk
mice
paket tersebut. Paket ini disiapkan untuk ini dan pengaturannya tanpa rasa sakit.Pertama-tama kita mengatur data seperti yang disarankan:
Selanjutnya kita memuat
mice
paket dan melihat metode apa yang dipilih secara default:The
pmm
singkatan rata pencocokan prediktif - mungkin algoritma imputasi paling populer untuk imputing variabel kontinu. Ini menghitung nilai prediksi menggunakan model regresi dan memilih 5 elemen terdekat dengan nilai prediksi (dengan jarak Euclidean ). Elemen-elemen yang dipilih disebut kolam donor dan nilai akhir dipilih secara acak dari kolam donor ini.Dari matriks prediksi kami menemukan bahwa metode mendapatkan variabel lulus yang menarik bagi pembatasan. Perhatikan bahwa baris adalah variabel target dan kolom prediktornya. Jika x1 tidak memiliki 1 di kolom x3 kita harus menambahkan ini dalam matriks:
imp_base$predictorMatrix["x1","x3"] <- 1
Sekarang ke bagian yang menyenangkan, menghasilkan metode imputasi. Saya telah memilih metode yang agak kasar di sini di mana saya membuang semua nilai jika tidak memenuhi kriteria. Ini dapat mengakibatkan waktu loop yang panjang dan mungkin berpotensi lebih efisien untuk menjaga imputasi yang valid dan hanya mengulang yang tersisa, itu akan memerlukan sedikit lebih banyak penyesuaian.
Setelah kita selesai mendefinisikan metode, kita dengan mudah mengubah metode sebelumnya. Jika Anda hanya ingin mengubah satu variabel maka Anda cukup menggunakan
imp_base$method["x2"] <- "pmm_x2"
tetapi untuk contoh ini kami akan mengubah semua (penamaan tidak perlu):Sekarang mari kita lihat dataset imputed ketiga:
Ok, itu berhasil. Saya suka solusi ini karena Anda dapat membonceng di atas fungsi utama dan hanya menambahkan batasan yang menurut Anda bermakna.
Memperbarui
Untuk menegakkan pengekangan ketat @ t0x1n yang disebutkan dalam komentar, kami mungkin ingin menambahkan kemampuan berikut ke fungsi pembungkus:
Ini menghasilkan fungsi pembungkus yang sedikit lebih rumit:
Perhatikan bahwa ini tidak bekerja dengan baik, kemungkinan besar karena set data yang disarankan gagal kendala untuk semua kasus tanpa hilang. Saya perlu menambah panjang loop menjadi 400-500 bahkan sebelum mulai berlaku. Saya berasumsi bahwa ini tidak disengaja, imputasi Anda harus meniru bagaimana data aktual dihasilkan.
Optimasi
Argumen tersebut
ry
berisi nilai-nilai yang tidak hilang dan kami mungkin dapat mempercepat loop dengan menghapus elemen yang telah kami temukan imputasi yang memenuhi syarat, tetapi karena saya tidak terbiasa dengan fungsi-fungsi internal saya telah menahan diri dari ini.Saya pikir hal yang paling penting ketika Anda memiliki kendala kuat yang membutuhkan waktu untuk mengisi penuh adalah untuk memparalelasikan imputasi Anda ( lihat jawaban saya di CrossValidated ). Sebagian besar memiliki komputer saat ini dengan 4-8 core dan R hanya menggunakan salah satunya secara default. Waktu dapat (hampir) diiris menjadi dua dengan menggandakan jumlah inti.
Parameter yang hilang saat imputasi
Mengenai masalah
x2
hilang pada saat imputasi - tikus sebenarnya tidak pernah memasukkan nilai yang hilang ke dalamx
-data.frame
. The tikus metode termasuk mengisi beberapa nilai acak di awal. Bagian rantai dari imputasi membatasi dampak dari nilai awal ini. Jika Anda melihatmice
-fungsi Anda dapat menemukan ini sebelum panggilan imputasi (mice:::sampler
-fungsi):The
data.init
dapat dipasok kemice
fungsi dan mice.imput.sample adalah prosedur dasar sampling.Mengunjungi urutan
Jika urutan kunjungan penting, Anda dapat menentukan urutan di mana
mice
-fungsi menjalankan imputasi. Default adalah dari1:ncol(data)
tetapi Anda dapat mengaturvisitSequence
untuk menjadi apa pun yang Anda suka.sumber
pmm_x1
: (1) Mengambil jumlah maksimum dari setiap kombinasi yang mungkin darix2
danx3
dari seluruh kumpulan data jauh lebih kuat daripada batasan aslinya. Hal yang benar akan menguji bahwa untuk setiap baris ,x1 < x2 + x3
. Tentu saja semakin banyak baris yang Anda miliki, semakin kecil peluang Anda untuk memenuhi batasan seperti itu (karena satu baris yang buruk akan merusak segalanya), dan semakin lama loop tersebut berpotensi dapat diperoleh.x1
danx2
tidak ada, Anda dapat menyalahkan nilai untukx1
mana kendala dipegang (katakanlah 50), tetapi begitux2
diperhitungkan mereka rusak (katakanlah itu diperhitungkan menjadi 55). Apakah ada cara untuk menyalahkan "secara horizontal" daripada vertikal? Dengan cara itu kita bisa menyalahkan satu barisx1
,x2
danx3
dan hanya re-menyalahkan sampai yang baris tertentu berada di bawah kendala. Itu harus cukup cepat, dan setelah selesai kita bisa pindah ke baris berikutnya. Tentu saja jika MI bersifat "vertikal", kita tidak beruntung. Dalam hal itu, mungkin pendekatan yang disebutkan Aleksandr?mice
paket. Terima kasih telah berbagi.debug()
untuk melihat bagaimanamice.impute.pmm
dan saudara kandungnya bekerja di bawah tenda.Hal terdekat yang bisa saya temukan adalah penyertaan informasi Amelia sebelumnya. Lihat bab 4.7 dalam sketsa , khususnya 4.7.2:
Jadi, meskipun Anda tidak akan dapat secara umum mengatakan sesuatu seperti
x1<x2+x3
, Anda bisa mengulang set data Anda dan menambahkan tingkat observasi sebelum untuk setiap kasus yang relevan. Batas konstan juga dapat diterapkan (seperti pengaturan x1, x2, dan x3 menjadi non-negatif). Sebagai contoh:sumber
Kendala mungkin lebih mudah diimplementasikan dalam prediksi pencocokan rata-rata imputasi ganda Ini mengasumsikan bahwa ada sejumlah besar pengamatan dengan variabel kendala yang tidak hilang yang memenuhi kendala. Saya sedang berpikir tentang mengimplementasikan ini dalam fungsi
Hmisc
paket R.aregImpute
Anda mungkin ingin memeriksa kembali dalam sebulan atau lebih. Penting untuk menentukan jarak maksimum dari target yang bisa diamati oleh donor, karena kendala akan mendorong donor lebih jauh dari donor ideal yang tidak dibatasi.sumber
x<y<z
.x1<x2
) terpenuhi?aregImpute
fungsi R dengan pencocokan rata-rata prediktif. Tetapi bagaimana jika tidak ada pengamatan donor (mendekati kecocokan prediksi) memenuhi kendala untuk pengamatan target yang diperhitungkan meskipun mereka jelas harus memenuhi kendala pada set variabel donor?Saya percaya bahwa paket
Amelia
(Amelia II) saat ini memiliki dukungan paling komprehensif untuk menentukan batasan rentang nilai data. Namun, masalahnya adalahAmelia
asumsi bahwa data normal multivarian.Jika dalam kasus Anda asumsi normalitas multivarian tidak berlaku, Anda mungkin ingin memeriksa
mice
paket, yang mengimplementasikan beberapa imputasi (MI) melalui persamaan dirantai . Paket ini tidak memiliki asumsi normalitas multivarian . Ini juga memiliki fungsi yang mungkin cukup untuk menentukan batasan , tapi saya tidak yakin sampai sejauh mana. Fungsi ini disebutsqueeze()
. Anda dapat membacanya di dokumentasi: http://cran.r-project.org/web/packages/mice/mice.pdf . Manfaat tambahan darimice
fleksibilitasnya adalah dalam hal memungkinkan spesifikasi fungsi imputasi yang ditentukan pengguna dan pemilihan algoritma yang lebih luas. Berikut tutorial tentang melakukan MI, menggunakanmice
:http://www.ats.ucla.edu/stat/r/faq/R_pmm_mi.htm .Sejauh yang saya mengerti,
Hmisc
paket Dr. Harrell , menggunakan pendekatan persamaan dirantai yang sama ( prediktif pencocokan rata-rata ), mungkin mendukung data yang tidak normal (dengan pengecualiannormpmm
metode). Mungkin dia sudah menerapkan fungsionalitas spesifikasi kendala sesuai jawabannya di atas. Saya belum pernah menggunakanaregImpute()
, jadi tidak bisa mengatakan lebih banyak tentang itu (saya sudah menggunakanAmelia
danmice
, tapi saya jelas bukan ahli dalam statistik, hanya mencoba belajar sebanyak yang saya bisa).Akhirnya, Anda mungkin menemukan ikhtisar berikut yang menarik, sedikit tanggal, tetapi masih bagus, tentang pendekatan, metode, dan perangkat lunak untuk beberapa imputasi data dengan nilai yang hilang: http://www.ncbi.nlm.nih.gov/pmc/articles / PMC1839993 . Saya yakin bahwa ada makalah tinjauan umum yang lebih baru tentang MI, tetapi hanya itu yang saya sadari saat ini. Saya harap ini agak membantu.
sumber
aregImpute
.squeeze
adalah batas-batasnya konstan, jadi Anda tidak bisa menentukan yang seperti itux1<x2
. Juga, tampaknya dipanggil pada hasil vektor hasil, yang saya percaya sudah terlambat. Sepertinya bagi saya bahwa batasan harus dipertimbangkan selama proses imputasi, sehingga mereka memiliki makna lebih dari penyesuaian setelah fakta.Amelia
, karena saya sudah beralih dari itu kemice
, segera setelah tes saya mengkonfirmasi bahwa data saya tidak normal multivarian. Namun, saya baru-baru ini menemukan set slide presentasi yang sangat bagus tentang topik ini (metode dan perangkat lunak MI): statistik.lmu.de/~fkreuter/imputation_sose2011/downloads/… . Jika saya mengerti dengan benar, itu menggambarkan solusi potensial untuk masalah kendala (lihat halaman PDF 50 - bukan nomor slide 50!). Semoga ini membantu.Jika saya memahami pertanyaan Anda dengan benar, menurut saya Anda sudah tahu nilai apa yang harus diambil oleh variabel yang hilang dengan tunduk pada beberapa kendala. Saya tidak terlalu fasih dalam SPSS tetapi di RI pikir Anda dapat menulis fungsi untuk melakukan itu (yang seharusnya tidak terlalu sulit tergantung pada pengalaman Anda, saya harus mengatakan). Saya tidak tahu ada paket yang berfungsi dengan kendala seperti itu.
sumber