Brian Borchers Antwort ist ziemlich gut - Daten, die seltsame Ausreißer enthalten, werden von OLS oft nicht gut analysiert. Ich werde dies nur erweitern, indem ich ein Bild, einen Monte Carlo und etwas R
Code hinzufüge .
Sie sich ein sehr einfaches Regressionsmodell vor:
Yi ϵi=β1xi+ϵi=⎧⎩⎨⎪⎪N(0,0.04)31−31w.p.w.p.w.p.0.9990.00050.0005
Dieses Modell entspricht Ihrem Setup mit einem Steigungskoeffizienten von 1.
Das angehängte Diagramm zeigt einen Datensatz, der aus 100 Beobachtungen zu diesem Modell besteht, wobei die x-Variable von 0 bis 1 reicht. Im geplotteten Datensatz gibt es eine Zeichnung für den Fehler, die einen Ausreißerwert ergibt (in diesem Fall +31). . Ebenfalls dargestellt sind die OLS-Regressionslinie in Blau und die Regressionslinie mit den geringsten absoluten Abweichungen in Rot. Beachten Sie, wie OLS, aber nicht LAD vom Ausreißer verzerrt wird:
Wir können dies überprüfen, indem wir einen Monte Carlo durchführen. Im Monte Carlo generiere ich einen Datensatz von 100 Beobachtungen mit demselben und einem mit der obigen Verteilung 10.000 Mal. Bei diesen 10.000 Replikationen werden wir in der überwiegenden Mehrheit keinen Ausreißer bekommen. Aber in ein paar Fällen werden wir einen Ausreißer bekommen, und es wird OLS vermasseln, aber nicht jedes Mal LAD. Der folgende Code führt den Monte Carlo aus. Hier sind die Ergebnisse für die Steigungskoeffizienten:ϵ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
Sowohl OLS als auch LAD erzeugen unverzerrte Schätzer (die Steigungen betragen durchschnittlich 1,00 über die 10.000 Replikationen). OLS erzeugt einen Schätzer mit einer viel höheren Standardabweichung, jedoch 0,34 gegenüber 0,09. Daher ist OLS hier unter unvoreingenommenen Schätzern nicht am besten / effizientesten. Es ist natürlich immer noch BLAU, aber LAD ist nicht linear, also gibt es keinen Widerspruch. Beachten Sie die wilden Fehler, die OLS in der Spalte Min und Max machen kann. Nicht so LAD.
Hier ist der R-Code sowohl für den Graphen als auch für den 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)