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
Perhatikan bahwa (sesuai R
konvensi) 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")