Методи цензурованої регресії можуть обробляти такі дані. Вони припускають, що залишки поводяться як у звичайній лінійній регресії, але були модифіковані так
(Ліва цензура): усі значення, менші за низький поріг, який не залежить від даних, (але може змінюватись від одного випадку до іншого), не були кількісно визначені; та / або
(Права цензура): усі значення, що перевищують високий поріг, незалежний від даних (але може змінюватись від одного випадку до іншого), не були кількісно визначені.
"Не кількісно оцінено" означає, що ми знаємо, падає чи ні значення нижче (або вище) його порогового значення, але це все.
Методи підгонки зазвичай використовують максимальну ймовірність. Коли модель відповіді відповідна вектору X, знаходиться у форміYX
Y∼Xβ+ε
при iid що має спільний розподіл F σ з PDF f σ (де σ невідомі "параметри неприємностей"), тоді - за відсутності цензури - ймовірність журналу спостережень ( x i , y i ) єεFσfσσ(xi,yi)
Λ=∑i=1nlogfσ(yi−xiβ).
При наявності цензури ми можемо розділити випадки на три (можливо, порожні) класи: для індексів до n 1 , y i містять нижнє порогове значення та представляють ліві цензурні дані; для індексів i = n 1 + 1 до n 2 , y i кількісно визначені; а для решти індексів y i містять верхні порогові значення і представляють правильну цензуруi=1n1yii=n1+1n2yiyiдані. Імовірність журналу отримується так само, як і раніше: це журнал добутку ймовірностей.
Λ=∑i=1n1logFσ(yi−xiβ)+∑i=n1+1n2logfσ(yi−xiβ)+∑i=n2+1nlog(1−Fσ(yi−xiβ)).
(β,σ)
На мій досвід, такі методи можуть добре працювати, коли цензуру проводять менше половини даних; в іншому випадку результати можуть бути нестабільними.
Ось простий R
приклад використання censReg
пакету, щоб проілюструвати, як результати OLS та цензури можуть відрізнятися (багато) навіть при великій кількості даних. Це якісно відтворює дані у питанні.
library("censReg")
set.seed(17)
n.data <- 2960
coeff <- c(-0.001, 0.005)
sigma <- 0.005
x <- rnorm(n.data, 0.5)
y <- as.vector(coeff %*% rbind(rep(1, n.data), x) + rnorm(n.data, 0, sigma))
y.cen <- y
y.cen[y < 0] <- 0
y.cen[y > 0.01] <- 0.01
data = data.frame(list(x, y.cen))
0.005−0.0010.005
Давайте використаємо обидва lm
та censReg
підходимо до рядка:
fit <- censReg(y.cen ~ x, data=data, left=0.0, right=0.01)
summary(fit)
Результати цієї цензурованої регресії, наведені компанією print(fit)
, є
(Intercept) x sigma
-0.001028 0.004935 0.004856
−0.0010.0050.005
fit.OLS <- lm(y.cen ~ x, data=data)
summary(fit.OLS)
Придатність OLS, надана компанією print(fit.OLS)
, є
(Intercept) x
0.001996 0.002345
summary
0.002864
Для порівняння обмежимо регресію кількісно оціненими даними:
fit.part <- lm(y[0 <= y & y <= 0.01] ~ x[0 <= y & y <= 0.01])
summary(fit.part)
(Intercept) x[0 <= y & y <= 0.01]
0.003240 0.001461
Навіть гірше!
Кілька картинок узагальнюють ситуацію.
lineplot <- function() {
abline(coef(fit)[1:2], col="Red", lwd=2)
abline(coef(fit.OLS), col="Blue", lty=2, lwd=2)
abline(coef(fit.part), col=rgb(.2, .6, .2), lty=3, lwd=2)
}
par(mfrow=c(1,4))
plot(x,y, pch=19, cex=0.5, col="Gray", main="Hypothetical Data")
lineplot()
plot(x,y.cen, pch=19, cex=0.5, col="Gray", main="Censored Data")
lineplot()
hist(y.cen, breaks=50, main="Censored Data")
hist(y[0 <= y & y <= 0.01], breaks=50, main="Quantified Data")
00.01
Y0.00320.0037