Nếu bạn thực sự muốn làm điều này (loại bỏ lớn nhất (tuyệt đối) dư), sau đó chúng tôi có thể sử dụng mô hình tuyến tính để ước tính ít nhất giải pháp hình vuông và số dư liên quan và sau đó chọn n% trung bình của dữ liệu. Dưới đây là một ví dụ:
Thứ nhất, tạo ra một số dữ liệu giả:
require(MASS) ## for mvrnorm()
set.seed(1)
dat <- mvrnorm(1000, mu = c(4,5), Sigma = matrix(c(1,0.8,1,0.8), ncol = 2))
dat <- data.frame(dat)
names(dat) <- c("X","Y")
plot(dat)
Tiếp theo, chúng tôi phù hợp với những mô hình tuyến tính và trích xuất các dư:
res <- resid(mod <- lm(Y ~ X, data = dat))
Chức năng quantile()
có thể cho chúng ta những yêu cầu số lượng của số dư. Bạn đề nghị giữ lại 90% dữ liệu, vì vậy chúng tôi muốn trên và dưới 0,05 quantiles:
res.qt <- quantile(res, probs = c(0.05,0.95))
Chọn những quan sát với dư ở giữa 90% dữ liệu:
want <- which(res >= res.qt[1] & res <= res.qt[2])
Chúng ta có thể sau đó hình dung này, với các điểm màu đỏ là những người chúng ta sẽ giữ lại:
plot(dat, type = "n")
points(dat[-want,], col = "black", pch = 21, bg = "black", cex = 0.8)
points(dat[want,], col = "red", pch = 21, bg = "red", cex = 0.8)
abline(mod, col = "blue", lwd = 2)
Các mối tương quan đối với dữ liệu đầy đủ và tập hợp con được lựa chọn là:
> cor(dat)
X Y
X 1.0000000 0.8935235
Y 0.8935235 1.0000000
> cor(dat[want,])
X Y
X 1.0000000 0.9272109
Y 0.9272109 1.0000000
> cor(dat[-want,])
X Y
X 1.000000 0.739972
Y 0.739972 1.000000
Hãy nhận biết rằng ở đây chúng tôi có thể được ném ra dữ liệu hoàn toàn tốt, bởi vì chúng tôi chỉ chọn 5% với dư dương lớn nhất và 5% với lớn nhất tiêu cực. Một cách khác là để chọn 90% với nhỏ tuyệt đối dư:
ares <- abs(res)
absres.qt <- quantile(ares, prob = c(.9))
abswant <- which(ares <= absres.qt)
## plot - virtually the same, but not quite
plot(dat, type = "n")
points(dat[-abswant,], col = "black", pch = 21, bg = "black", cex = 0.8)
points(dat[abswant,], col = "red", pch = 21, bg = "red", cex = 0.8)
abline(mod, col = "blue", lwd = 2)
Với tập hợp con hơi khác nhau này, mối tương quan là hơi thấp:
> cor(dat[abswant,])
X Y
X 1.0000000 0.9272032
Y 0.9272032 1.0000000
điểm nữa là thậm chí sau đó chúng ta đang ném ra dữ liệu tốt. Bạn có thể muốn nhìn vào khoảng cách Cook như một thước đo sức mạnh của các ngoại lệ, và loại bỏ chỉ những giá trị trên một ngưỡng nhất định của Cook.Wikipedia có thông tin về khoảng cách của Cook và các ngưỡng được đề xuất. Chức năng cooks.distance()
có thể được sử dụng để lấy các giá trị từ mod
:
> head(cooks.distance(mod))
1 2 3 4 5 6
7.738789e-04 6.056810e-04 6.375505e-04 4.338566e-04 1.163721e-05 1.740565e-03
và nếu bạn tính toán ngưỡng (s) gợi ý trên Wikipedia và chỉ loại bỏ những người mà vượt quá ngưỡng. Đối với những dữ liệu này:
> any(cooks.distance(mod) > 1)
[1] FALSE
> any(cooks.distance(mod) > (4 * nrow(dat)))
[1] FALSE
không ai trong số khoảng cách của Nấu vượt quá ngưỡng đề xuất (. Không gây ngạc nhiên vì cách tôi tạo ra các dữ liệu)
Có nói tất cả điều này, tại sao bạn muốn làm điều này? Nếu bạn đang cố gắng loại bỏ dữ liệu để cải thiện mối tương quan hoặc tạo ra một mối quan hệ đáng kể, điều đó nghe có vẻ hơi giống một chút và giống như dữ liệu nạo vét cho tôi.
gì bạn xem xét một outlier đây? Độ lệch từ đường thẳng nhỏ nhất phù hợp (nghĩa là số dư lớn nhất), hoặc giá trị ở cực đại của phân phối hai biến số của 'x' và' y'? –
@Gavin Ở đây tôi xem số dư lớn nhất là ngoại lệ. – Leo