Métodos de regressão censurada podem manipular dados como este. Eles assumem que os resíduos se comportam como na regressão linear comum, mas foram modificados para que
(Censura à esquerda): todos os valores menores que um limite baixo, independente dos dados, mas que podem variar de um caso para outro, não foram quantificados; e / ou
(Censura à direita): todos os valores maiores que um limite alto, independente dos dados (mas podem variar de um caso para outro), não foram quantificados.
"Não quantificado" significa que sabemos se um valor cai ou não abaixo ou acima de seu limite, mas é tudo.
YX
Y∼Xβ+ε
εFσfσσ(xi,yi)
Λ=∑i=1nlogfσ(yi−xiβ).
i=1n1yii=n1+1n2yiyidados. A probabilidade do log é obtida da mesma maneira que antes: é o log do produto das probabilidades.
Λ=∑i=1n1logFσ(yi−xiβ)+∑i=n1+1n2logfσ(yi−xiβ)+∑i=n2+1nlog(1−Fσ(yi−xiβ)).
(β,σ)
Na minha experiência, esses métodos podem funcionar bem quando menos da metade dos dados são censurados; caso contrário, os resultados podem ser instáveis.
Aqui está um R
exemplo simples de como usar o censReg
pacote para ilustrar como OLS e resultados censurados podem diferir (muito), mesmo com muitos dados. Reproduz qualitativamente os dados na pergunta.
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
Vamos usar os dois lm
e censReg
para ajustar uma linha:
fit <- censReg(y.cen ~ x, data=data, left=0.0, right=0.01)
summary(fit)
Os resultados dessa regressão censurada, dados por print(fit)
, são
(Intercept) x sigma
-0.001028 0.004935 0.004856
−0.0010.0050.005
fit.OLS <- lm(y.cen ~ x, data=data)
summary(fit.OLS)
O ajuste OLS, dado por print(fit.OLS)
, é
(Intercept) x
0.001996 0.002345
summary
0.002864
Para comparação, vamos limitar a regressão aos dados quantificados:
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
Pior ainda!
Algumas fotos resumem a situação.
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