La réponse de Brian Borchers est assez bonne --- les données qui contiennent des valeurs aberrantes étranges ne sont souvent pas bien analysées par OLS. Je vais juste développer cela en ajoutant une image, un Monte Carlo et du R
code.
Considérons un modèle de régression très simple:
Ouije ϵje= β1Xje+ ϵje= ⎧⎩⎨⎪⎪N( 0 , 0,04 )31- 31w . p .w . p .w . p .0,9990,00050,0005
Ce modèle est conforme à votre configuration avec un coefficient de pente de 1.
Le graphique ci-joint montre un ensemble de données composé de 100 observations sur ce modèle, avec la variable x allant de 0 à 1. Dans l'ensemble de données tracé, il y a un tirage sur l'erreur qui donne une valeur aberrante (+31 dans ce cas) . La ligne de régression OLS en bleu et la ligne de régression des écarts les moins absolus en rouge sont également représentées. Remarquez comment OLS mais pas LAD est déformé par la valeur aberrante:
XϵR
Mean Std Dev Minimum Maximum
Slope by OLS 1.00 0.34 -1.76 3.89
Slope by LAD 1.00 0.09 0.66 1.36
OLS et LAD produisent des estimateurs non biaisés (les pentes sont toutes deux de 1,00 en moyenne sur les 10 000 répétitions). OLS produit un estimateur avec un écart-type beaucoup plus élevé, cependant, 0,34 vs 0,09. Ainsi, l'OLS n'est pas le meilleur / le plus efficace parmi les estimateurs sans biais, ici. C'est toujours BLEU, bien sûr, mais LAD n'est pas linéaire, il n'y a donc pas de contradiction. Notez les erreurs sauvages que OLS peut faire dans la colonne Min et Max. Pas si CONTRE.
Voici le code R pour le graphique et le Monte Carlo:
# This program written in response to a Cross Validated question
# http://stats.stackexchange.com/questions/82864/when-would-least-squares-be-a-bad-idea
# The program runs a monte carlo to demonstrate that, in the presence of outliers,
# OLS may be a poor estimation method, even though it is BLUE.
library(quantreg)
library(plyr)
# Make a single 100 obs linear regression dataset with unusual error distribution
# Naturally, I played around with the seed to get a dataset which has one outlier
# data point.
set.seed(34543)
# First generate the unusual error term, a mixture of three components
e <- sqrt(0.04)*rnorm(100)
mixture <- runif(100)
e[mixture>0.9995] <- 31
e[mixture<0.0005] <- -31
summary(mixture)
summary(e)
# Regression model with beta=1
x <- 1:100 / 100
y <- x + e
# ols regression run on this dataset
reg1 <- lm(y~x)
summary(reg1)
# least absolute deviations run on this dataset
reg2 <- rq(y~x)
summary(reg2)
# plot, noticing how much the outlier effects ols and how little
# it effects lad
plot(y~x)
abline(reg1,col="blue",lwd=2)
abline(reg2,col="red",lwd=2)
# Let's do a little Monte Carlo, evaluating the estimator of the slope.
# 10,000 replications, each of a dataset with 100 observations
# To do this, I make a y vector and an x vector each one 1,000,000
# observations tall. The replications are groups of 100 in the data frame,
# so replication 1 is elements 1,2,...,100 in the data frame and replication
# 2 is 101,102,...,200. Etc.
set.seed(2345432)
e <- sqrt(0.04)*rnorm(1000000)
mixture <- runif(1000000)
e[mixture>0.9995] <- 31
e[mixture<0.0005] <- -31
var(e)
sum(e > 30)
sum(e < -30)
rm(mixture)
x <- rep(1:100 / 100, times=10000)
y <- x + e
replication <- trunc(0:999999 / 100) + 1
mc.df <- data.frame(y,x,replication)
ols.slopes <- ddply(mc.df,.(replication),
function(df) coef(lm(y~x,data=df))[2])
names(ols.slopes)[2] <- "estimate"
lad.slopes <- ddply(mc.df,.(replication),
function(df) coef(rq(y~x,data=df))[2])
names(lad.slopes)[2] <- "estimate"
summary(ols.slopes)
sd(ols.slopes$estimate)
summary(lad.slopes)
sd(lad.slopes$estimate)