Brian Borchers respuesta es muy buena---los datos que contienen extraño valores atípicos a menudo no son bien analizados por OLS. Yo sólo voy a ampliar sobre esto mediante la adición de una imagen, un Monte Carlo, y algunos R
código.
Considere la posibilidad de una muy simple modelo de regresión:
\begin{align}
Y_i &= \beta_1 x_i + \epsilon_i\\~\\
\epsilon_i &= \left\{\begin{array}{rcl}
N(0,0.04) &w.p. &0.999\\
31 &w.p. &0.0005\\
-31 &w.p. &0.0005 \end{array} \right.
\end{align}
Este modelo se ajusta a la configuración con un coeficiente de la pendiente de 1.
Adjunto gráfico muestra un conjunto de datos que consta de 100 observaciones sobre este modelo, con la variable x de la ejecución de 0 a 1. En los trazados conjunto de datos, hay un sorteo en el error, el cual viene con un valor atípico valor (+31 en este caso). También se representa son la regresión por MCO de la línea en azul y el mínimo absolutos de las desviaciones de la regresión de la línea en rojo. Observe cómo OLS pero no MUCHACHO está distorsionada por el outlier:
Podemos verificar esta haciendo un Monte Carlo. En el Monte Carlo, generar un conjunto de datos de 100 observaciones utilizando el mismo $x$ e una $\epsilon$ con la anterior distribución de 10.000 veces. En los 10.000 replicaciones, no vamos a obtener un valor atípico en la gran mayoría. Pero a los pocos vamos a conseguir un valor atípico, y se va a atornillar OLS pero no MUCHACHO cada vez. El R
código a continuación se ejecuta el Monte Carlo. Aquí están los resultados para los coeficientes de la pendiente:
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
Ambos OLS y LAD producir estimadores insesgados de (las pistas son tanto 1.00 promedio de más de 10.000 replicaciones). OLS produce un estimador con una mayor desviación estándar, sin embargo, 0,34 frente a 0.09. Por lo tanto, la OPERACIÓN no es mejor y más eficiente entre los imparcial de los peritos, aquí. Todavía es AZUL, claro, pero el CHAVAL no es lineal, por lo que no hay ninguna contradicción. Aviso el salvaje errores OLS puede hacer en el Min y Max de la columna. No tan CHAVAL.
Aquí está el código R para ambos, el gráfico y el de 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)