คำตอบของ Brian Borchers ค่อนข้างดี --- ข้อมูลที่มีค่าผิดปกติมักไม่ได้รับการวิเคราะห์โดย OLS ฉันเพิ่งจะขยายเรื่องนี้โดยการเพิ่มรูปภาพ Monte Carlo และR
โค้ดบางส่วน
พิจารณารูปแบบการถดถอยที่ง่ายมาก:
Yi ϵi=β1xi+ϵi=⎧⎩⎨⎪⎪N(0,0.04)31−31w.p.w.p.w.p.0.9990.00050.0005
รุ่นนี้สอดคล้องกับการตั้งค่าของคุณด้วยค่าสัมประสิทธิ์ความชัน 1
พล็อตที่แนบมาแสดงชุดข้อมูลซึ่งประกอบด้วยการสังเกต 100 ครั้งในโมเดลนี้โดยที่ตัวแปร x รันจาก 0 ถึง 1 ในชุดข้อมูลที่มีการพล็อตมีหนึ่งการดึงข้อผิดพลาดซึ่งเกิดขึ้นกับค่าที่ผิดพลาด (+31 ในกรณีนี้) . พล็อตก็คือเส้นการถดถอย OLS เป็นสีน้ำเงินและเส้นการถดถอยเบี่ยงเบนสัมบูรณ์สัมบูรณ์เป็นสีแดง สังเกตว่า OLS แต่ไม่ใช่ LAD จะถูกบิดเบือนโดยค่าเริ่มต้น:
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 และ LAD สร้างตัวประมาณที่ไม่เอนเอียง (ความลาดชันโดยเฉลี่ยอยู่ที่ 1.00 มากกว่า 10,000 ซ้ำ) OLS สร้างตัวประมาณค่าด้วยค่าเบี่ยงเบนมาตรฐานที่สูงกว่ามากแม้ว่า 0.34 เทียบกับ 0.09 ดังนั้น OLS จึงไม่ดีที่สุด / มีประสิทธิภาพมากที่สุดในการประมาณที่ไม่เอนเอียงนี่ มันยังคงเป็นสีฟ้าแน่นอน แต่ LAD ไม่เชิงเส้นดังนั้นจึงไม่มีความขัดแย้ง สังเกตว่าข้อผิดพลาด wild ที่ OLS สามารถทำได้ในคอลัมน์ Min และ Max ไม่เช่นนั้น
นี่คือรหัส R สำหรับทั้งกราฟและ 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)