Если вы действительно хотите сделать это (удалите самые большие (абсолютные) остатки), то мы можем использовать линейную модель для оценки наименьшего квадратов и связанных остатков, а затем выберите средний n% данных. Вот пример:
Во-первых, сформировать фиктивный данные:
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)
Далее мы вписываемся линейную модель и извлечь остатки:
res <- resid(mod <- lm(Y ~ X, data = dat))
quantile()
функция может дать нам требуемой квантилей остатков. Вы предложили сохранить 90% данных, поэтому мы хотим, чтобы верхние и нижние 0,05 квантили:
res.qt <- quantile(res, probs = c(0.05,0.95))
Выберите те наблюдения с остатками в среднем 90% данных:
want <- which(res >= res.qt[1] & res <= res.qt[2])
мы можем визуализировать это, с красными точками быть те, мы сохраним:
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)
корреляция для полных данных и выбранного подмножества являются:
> 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
Имейте в виде, что здесь мы могли бы выбросить совершенно хорошие данные, потому что мы просто выбираем 5% с крупнейшими положительными остатками и 5% с самым большим отрицательный. Альтернатива заключается в выборе 90% с наименьшим абсолютных остатков:
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)
С помощью этого немного другой подгруппе, корреляция немного ниже:
> cor(dat[abswant,])
X Y
X 1.0000000 0.9272032
Y 0.9272032 1.0000000
Другое дело, что даже тогда мы бросали из хороших данных. Возможно, вам стоит взглянуть на расстояние Кука в меру силы выброса и отбросить только те значения, которые превышают определенный порог Кука.Wikipedia имеет информацию о расстоянии Кука и предлагаемых порогах. cooks.distance()
функция может быть использована для извлечения значений из 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
и если вы вычислить порог (s) предложил в Википедии и удалить только те, которые превышают порог. Для этих данных:
> any(cooks.distance(mod) > 1)
[1] FALSE
> any(cooks.distance(mod) > (4 * nrow(dat)))
[1] FALSE
ни расстояний кухарки не превышают предлагаемые пороговые значения (. Не удивительно, учитывая то, как я сгенерировал данные)
Сказав все это, почему вы хотите это сделать? Если вы просто пытаетесь избавиться от данных, чтобы улучшить корреляцию или создать значительную взаимосвязь, это звучит немного подозрительно и бит, как данные дноуглубительные работы для меня.
Что вы считаете особняком здесь? Отклонение от линии подгонки наименьших квадратов (т. Е. Наибольшие остатки) или значений в крайних точках двумерного распределения 'x' и' y'? –
@Gavin Здесь я считаю, что наибольшие остатки являются выбросами. – Leo