Si realmente quiere hacer esto (eliminar los residuos más grandes (absolutos)), entonces podemos emplear el modelo lineal para estimar la menor solución de cuadrados y residuales asociados y luego seleccionar el n% medio de los datos. He aquí un ejemplo:
En primer lugar, generar algunos datos ficticios:
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)
A continuación, se ajusta al modelo lineal y extraer los residuos:
res <- resid(mod <- lm(Y ~ X, data = dat))
La función quantile()
nosotros el requerido puede dar cuantiles de los residuales. Usted sugirió retener el 90% de los datos, por lo que queremos que el superior e inferior de 0,05 cuantiles:
res.qt <- quantile(res, probs = c(0.05,0.95))
Seleccionar esas observaciones con los residuos en el medio del 90% de los datos:
want <- which(res >= res.qt[1] & res <= res.qt[2])
Podemos entonces visualizar esto, con los puntos rojos que son los que vamos a retener:
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)
Las correlaciones para los datos completos y el subconjunto seleccionado son:
> 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
Tenga en cuenta que aquí podríamos estar tirar perfectamente buenos datos, porque simplemente selecciona el 5% con mayores residuos positivos y 5% con el mayor negativo Una alternativa es seleccionar el 90% con más pequeños absolutos residuos:
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)
Con esta ligeramente diferente subconjunto, la correlación es ligeramente inferior:
> cor(dat[abswant,])
X Y
X 1.0000000 0.9272032
Y 0.9272032 1.0000000
Otro punto es que incluso entonces estamos tirando sacar buenos datos. Es posible que desee ver la distancia de Cook como una medida de la fuerza de los valores atípicos, y descartar solo los valores por encima de un cierto umbral de distancia de Cook.Wikipedia tiene información sobre la distancia de Cook y los umbrales propuestos. La función cooks.distance()
se puede utilizar para recuperar los valores de 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
y si usted calcula el umbral (s) sugirió en Wikipedia y eliminar sólo aquellos que superan el umbral. Para estos datos:
> any(cooks.distance(mod) > 1)
[1] FALSE
> any(cooks.distance(mod) > (4 * nrow(dat)))
[1] FALSE
ninguna de las distancias de Cook inferior a los límites propuestos (. No es sorprendente dada la forma en que generan los datos)
Habiendo dicho todo esto, ¿por qué quieres hacer esto? Si solo estás tratando de deshacerte de los datos para mejorar una correlación o generar una relación significativa, eso suena un poco sospechoso y un poco como el dragado de datos para mí.
¿Cuál considera un valor atípico aquí? ¿Desviación de la línea de ajuste de mínimos cuadrados (es decir, residuos más grandes) o valores en los extremos de la distribución bivariante de 'x' y' y'? –
@Gavin Considero que los residuos más grandes son valores atípicos. – Leo