menggunakan informasi tetangga dalam memasukkan data atau mencari off-data (dalam R)

13

Saya memiliki dataset dengan asumsi bahwa tetangga terdekat adalah prediktor terbaik. Hanya contoh sempurna dari gradien dua arah divisualisasikan-

masukkan deskripsi gambar di sini

Misalkan kita memiliki kasus di mana beberapa nilai hilang, kita dapat dengan mudah memprediksi berdasarkan tetangga dan tren.

masukkan deskripsi gambar di sini

Matriks data yang sesuai dalam R (contoh boneka untuk latihan):

miss.mat <- matrix (c(5:11, 6:10, NA,12, 7:13, 8:14, 9:12, NA, 14:15, 10:16),ncol=7, byrow = TRUE)
miss.mat 
    [,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,]    5    6    7    8    9   10   11
[2,]    6    7    8    9   10   NA   12
[3,]    7    8    9   10   11   12   13
[4,]    8    9   10   11   12   13   14
[5,]    9   10   11   12   NA   14   15
[6,]   10   11   12   13   14   15   16

Catatan: (1) Properti nilai yang hilang diasumsikan acak , dapat terjadi di mana saja.

(2) Semua titik data berasal dari variabel tunggal, tetapi nilainya diasumsikan dipengaruhi oleh neighborsbaris dan kolom yang berdekatan dengannya. Jadi posisi dalam matriks itu penting dan dapat dianggap sebagai variabel lain.

Harapan saya dalam beberapa situasi, saya dapat memprediksi beberapa nilai yang hilang (mungkin kesalahan) dan mengoreksi bias (misalnya, mari kita buat kesalahan seperti itu dalam data dummy):

> mat2 <- matrix (c(4:10, 5, 16, 7, 11, 9:11, 6:12, 7:13, 8:14, 9:13, 4,15, 10:11, 2, 13:16),ncol=7, byrow = TRUE)
> mat2

    [,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,]    4    5    6    7    8    9   10
[2,]    5   16    7   11    9   10   11
[3,]    6    7    8    9   10   11   12
[4,]    7    8    9   10   11   12   13
[5,]    8    9   10   11   12   13   14
[6,]    9   10   11   12   13    4   15
[7,]   10   11    2   13   14   15   16

Contoh di atas hanyalah ilustrasi (mungkin dijawab secara visual) tetapi contoh nyata mungkin lebih membingungkan. Saya mencari apakah ada metode yang kuat untuk melakukan analisis tersebut. Saya pikir ini harusnya mungkin. Metode apa yang cocok untuk melakukan jenis analisis ini? ada saran R program / paket untuk melakukan analisis jenis ini?

masukkan deskripsi gambar di sini

belajar
sumber
Dapatkah Anda berasumsi bahwa data yang hilang adalah MAR (dalam terminologi Rubin (1976))?
user603
ya, nilainya dapat dianggap hilang secara acak (MAR). Lihat hasil edit terbaru saya.
rdorlearn

Jawaban:

7

Pertanyaannya menanyakan cara untuk menggunakan tetangga terdekat dengan cara yang kuat untuk mengidentifikasi dan memperbaiki pencilan yang dilokalkan. Mengapa tidak melakukan hal itu?

Prosedurnya adalah menghitung kelancaran lokal yang kuat, mengevaluasi residu, dan menghilangkan semua yang terlalu besar. Ini memenuhi semua persyaratan secara langsung dan cukup fleksibel untuk menyesuaikan dengan aplikasi yang berbeda, karena seseorang dapat memvariasikan ukuran lingkungan lokal dan ambang batas untuk mengidentifikasi outlier.

(Mengapa fleksibilitas begitu penting? Karena setiap prosedur tersebut berdiri sebuah kesempatan baik untuk mengidentifikasi perilaku lokal tertentu sebagai "terpencil". Dengan demikian, semua prosedur tersebut dapat dianggap smoothers . Mereka akan menghilangkan beberapa detail yang bersama dengan outlier jelas. Analis membutuhkan kontrol atas pertukaran antara mempertahankan detail dan gagal mendeteksi outlier lokal.)

Keuntungan lain dari prosedur ini adalah tidak memerlukan matriks nilai persegi panjang. Bahkan, itu bahkan dapat diterapkan pada data tidak teratur dengan menggunakan lebih halus lokal yang cocok untuk data tersebut.

R, serta sebagian besar paket statistik berfitur lengkap, memiliki beberapa smoothers lokal yang tangguh, seperti loess. Contoh berikut ini diproses menggunakannya. Matriks ini memiliki baris dan 49 kolom - hampir 4000 entri. Ini merupakan fungsi rumit yang memiliki beberapa ekstrema lokal serta seluruh garis titik di mana ia tidak dapat dibedakan ("lipatan"). Untuk sedikit lebih dari 5 % dari poin - proporsi yang sangat tinggi untuk dianggap "terpencil" - ditambahkan kesalahan Gaussian yang standar deviasi hanya 1 / 20 dari standar deviasi dari data asli. Dataset sintetis ini dengan demikian menghadirkan banyak fitur menantang dari data realistis.794940005%1/20

Tokoh

Perhatikan bahwa (sesuai Rkonvensi) baris matriks digambar sebagai strip vertikal. Semua gambar, kecuali residu, berbukit untuk membantu menampilkan variasi kecil dalam nilainya. Tanpa ini, hampir semua outlier lokal tidak akan terlihat!

Dengan membandingkan "Imputed" (diperbaiki) ke "Real" (asli tidak terkontaminasi) gambar, jelas bahwa menghapus outlier telah merapikan beberapa, tetapi tidak semua, dari lipatan (yang berjalan dari ke bawah untuk(0,79)(49,30)

Bintik-bintik dalam plot "Residual" menunjukkan outlier lokal yang terisolasi. Plot ini juga menampilkan struktur lain (seperti garis diagonal) yang disebabkan oleh data yang mendasarinya. Seseorang dapat memperbaiki prosedur ini dengan menggunakan model data spasial ( melalui metode geostatistik), tetapi menggambarkan dan menggambarkannya akan membawa kita terlalu jauh ke sini.

1022003600 - sehingga mereka tidak membuat perubahan yang dapat dideteksi di permukaan.

#
# Create data.
#
set.seed(17)
rows <- 2:80; cols <- 2:50
y <- outer(rows, cols, 
           function(x,y) 100 * exp((abs(x-y)/50)^(0.9)) * sin(x/10) * cos(y/20))
y.real <- y
#
# Contaminate with iid noise.
#
n.out <- 200
cat(round(100 * n.out / (length(rows)*length(cols)), 2), "% errors\n", sep="")
i.out <- sample.int(length(rows)*length(cols), n.out)
y[i.out] <- y[i.out] + rnorm(n.out, sd=0.05 * sd(y))
#
# Process the data into a data frame for loess.
#
d <- expand.grid(i=1:length(rows), j=1:length(cols))
d$y <- as.vector(y)
#
# Compute the robust local smooth.
# (Adjusting `span` changes the neighborhood size.)
#
fit <- with(d, loess(y ~ i + j, span=min(1/2, 125/(length(rows)*length(cols)))))
#
# Display what happened.
#
require(raster)
show <- function(y, nrows, ncols, hillshade=TRUE, ...) {
  x <- raster(y, xmn=0, xmx=ncols, ymn=0, ymx=nrows)
  crs(x) <- "+proj=lcc +ellps=WGS84"
  if (hillshade) {
    slope <- terrain(x, opt='slope')
    aspect <- terrain(x, opt='aspect')
    hill <- hillShade(slope, aspect, 10, 60)
    plot(hill, col=grey(0:100/100), legend=FALSE, ...)
    alpha <- 0.5; add <- TRUE
  } else {
    alpha <- 1; add <- FALSE
  }
  plot(x, col=rainbow(127, alpha=alpha), add=add, ...)
}

par(mfrow=c(1,4))
show(y, length(rows), length(cols), main="Data")

y.res <- matrix(residuals(fit), nrow=length(rows))
show(y.res, length(rows), length(cols), hillshade=FALSE, main="Residuals")
#hist(y.res, main="Histogram of Residuals", ylab="", xlab="Value")

# Increase the `8` to find fewer local outliers; decrease it to find more.
sigma <- 8 * diff(quantile(y.res, c(1/4, 3/4)))
mu <- median(y.res)
outlier <- abs(y.res - mu) > sigma
cat(sum(outlier), "outliers found.\n")

# Fix up the data (impute the values at the outlying locations).
y.imp <- matrix(predict(fit), nrow=length(rows))
y.imp[outlier] <- y[outlier] - y.res[outlier]

show(y.imp, length(rows), length(cols), main="Imputed")
show(y.real, length(rows), length(cols), main="Real")
whuber
sumber
whuber: Apakah saya mengerti dengan benar bahwa Anda menganggap bahwa outlier adalah sel yang terisolasi? Jika demikian, apakah Anda tahu seberapa sensitif pendekatan ini terhadap pelanggaran asumsi ini?
user603
@ user603 Saya tidak menganggap outlier terisolasi - banyak dari mereka dalam contoh tidak - tetapi saya berasumsi bahwa proporsi outlier di lingkungan lokal cukup rendah sehingga mereka tidak akan memecah halus lokal. Dapat diperdebatkan, jika ada lingkungan dengan proporsi outlier yang sangat besar, mereka tidak lagi dianggap outlier lokal!
whuber
1
@ user603 Tentu Saja! Tapi itu tampaknya membawa kita keluar dari situasi dugaan di mana "tetangga terdekat adalah prediktor terbaik." Untuk menghormati itu, apa pun yang kami lakukan saat memproses data harus mempertahankan prediktabilitas lokal ini. Jika satu kolom memiliki "skala yang sangat berbeda" dari tetangganya, keadaan itu akan melanggar asumsi yang dinyatakan ini dengan sangat kuat. (Saya juga bertanya-tanya pada fokus Anda pada kolom: setelah membaca kembali pertanyaan, saya tidak dapat mendeteksi adanya asimetri dalam peran kolom dan baris.)
whuber
1
p
1
@whuber ini adalah solusi yang bagus, terima kasih - Saya mencoba untuk memperkenalkan setidaknya beberapa nilai yang hilang, yang selalu merupakan situasi nyata - campuran dari yang hilang (misalnya 50 nilai yang hilang) dan outlier (100 outlier). menarik!
rdorlearn
4

Saya menyarankan Anda untuk melihat artikel ini [0]. Masalah yang hendak ditangani tampaknya cocok dengan deskripsi Anda dengan baik, kecuali bahwa metode yang diusulkan oleh penulis sedikit lebih halus daripada input-NN (meskipun menggunakan sesuatu yang mirip dengan titik awal).

XXnp

k dekomposisi PCA kuat dari matriks data Anda dengan cara yang tahan terhadap kemungkinan adanya outlier (ini dilakukan dengan menggunakan fungsi kerugian yang dibatasi saat memperkirakan komponen PCA) dan nilai yang hilang ( ini dilakukan dengan menggunakan metode imputasi tipe EM). Seperti yang saya jelaskan di bawah ini, begitu Anda memiliki dekomposisi PCA dari dataset Anda, mengisi elemen yang hilang (dan menilai ketidakpastian di sekitar perkiraan ini cukup mudah).

Langkah pertama dari setiap iterasi adalah langkah imputasi data. Ini dilakukan seperti pada algoritma EM: sel-sel yang hilang diisi oleh nilai yang diharapkan mereka miliki (ini adalah E-step).

XXttRppkLLkkDDkp

Untuk meringkas makalah, berikut adalah algoritma umum yang mereka usulkan:

  • l=0WW0XX

  • Kemudian, lakukan hingga konvergensi:

    WWl(ttl,LLl,DDl)

    l=l+1

    YYl=LLl1(WWl1ttl1)(LLl1)

    d. isi elemen hilangWWlWWlN(ttl1,LLl1DDl1(LLl1))YYl

||WWl1WWl||F(tt,LL,DD)

(ttl1,LLl1DDl1)

N(ttl1,LLDD(LL))

Saya tidak tahu tentang implementasi R siap pakai untuk pendekatan ini, tetapi orang dapat dengan mudah diproduksi dari sub-komponen (terutama algoritma PCA yang kuat), dan ini diimplementasikan dengan baik dalam R, lihat paket rrcov (makalah ini tenang informatif tentang hal ini).

  • [0] Serneels S. dan Verdonck, T. (2008). Analisis komponen utama untuk data yang mengandung outlier dan elemen yang hilang. Statistik Komputasi & Analisis Data vol: 52 masalah: 3 halaman: 1712-1727.
pengguna603
sumber
terima kasih, tujuan saya di sini bukan untuk memprediksi outlier (dalam arti mereka jauh dari distribusi) bukan off-nilai (outlier) tidak sesuai dengan pola.
rdorlearn
Saya pikir Anda salah mengerti jawaban saya. Pendekatan ini akan menghasilkan prediksi untuk nilai apa pun, tetapi outlier tidak akan diprediksi dengan baik: ini karena mereka tidak diizinkan untuk mempengaruhi kecocokan PCA. Saya menyarankan Anda untuk membaca koran.
user603
terima kasih, pendekatannya tampak menarik dan tebakan juga bisa berhasil. Tetapi tanpa kode yang tepat akan sulit untuk diterapkan - setidaknya terlalu canggih untuk saya!
rdorlearn