Se davvero vuole fare questo (togliere i residui più grandi (assoluti)), allora possiamo utilizzare il modello lineare per stimare il minimo soluzione quadrata e residui associati e quindi selezionare il mezzo% dei dati. Ecco un esempio:
In primo luogo, generare alcuni dati dummy:
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)
Successivamente, montare il modello lineare ed estrarre i residui:
res <- resid(mod <- lm(Y ~ X, data = dat))
La funzione quantile()
noi la richiesta può dare quantili dei residui. È suggerito conservando il 90% dei dati, quindi vogliamo le superiori e inferiori 0,05 quantili:
res.qt <- quantile(res, probs = c(0.05,0.95))
Selezionare tali osservazioni con residui in mezzo il 90% dei dati:
want <- which(res >= res.qt[1] & res <= res.qt[2])
Possiamo quindi visualizzare questo, con i punti rossi sono quelli tratterremo:
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)
Le correlazioni per i dati completi e il sottoinsieme selezionato sono:
> 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
essere consapevoli del fatto che qui ci potrebbe essere buttare fuori perfettamente buoni dati, perché abbiamo appena scelto il 5%, con grandi residui positivi e 5% con il più grande negativo. Un'alternativa consiste nel selezionare il 90% con piccole assoluti residui:
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 questo leggermente diverso sottoinsieme, la correlazione è leggermente inferiore:
> cor(dat[abswant,])
X Y
X 1.0000000 0.9272032
Y 0.9272032 1.0000000
altro punto è che anche allora stiamo gettando buoni dati. Potresti voler considerare la distanza di Cook come una misura della forza dei valori anomali e scartare solo quei valori al di sopra di una certa soglia della distanza di Cook.Wikipedia ha informazioni sulla distanza di Cook e le soglie proposte. La funzione cooks.distance()
può essere utilizzata per recuperare i valori da 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
e se si calcola la soglia di (s) consigliato su Wikipedia e rimuovere solo quelli che superano la soglia. Per questi dati:
> any(cooks.distance(mod) > 1)
[1] FALSE
> any(cooks.distance(mod) > (4 * nrow(dat)))
[1] FALSE
nessuna delle distanze del cuoco inferiore alle soglie proposte (. Non sorprende, dato il modo in cui ho generato i dati)
Detto tutto questo, perché vuoi fare questo? Se stai solo cercando di sbarazzarti dei dati per migliorare una correlazione o generare una relazione significativa, sembra un po 'strano e un po' come i dati che mi draghano.
Quale ritiene sia un outlier qui? Deviazione dalla linea di adattamento dei minimi quadrati (cioè i maggiori residui), o valori agli estremi della distribuzione bivariata di 'x' e' y'? –
@Gavin Qui considero i più grandi residui da valori anomali. – Leo