I metodi di regressione censurata possono gestire dati come questo. Assumono che i residui si comportino come nella normale regressione lineare ma sono stati modificati in modo tale
(Censura di sinistra): non sono stati quantificati tutti i valori inferiori a una soglia bassa, indipendente dai dati (ma che può variare da un caso all'altro); e / o
(Censura corretta): non sono stati quantificati tutti i valori superiori a una soglia elevata, che è indipendente dai dati (ma può variare da un caso all'altro).
"Non quantificato" significa che sappiamo se un valore scende al di sotto (o al di sopra) della sua soglia, ma questo è tutto.
I metodi di adattamento utilizzano in genere la massima probabilità. Quando il modello per la risposta corrispondente a un vettore X è nella formaYX
Y∼Xβ+ε
con iid con una distribuzione comune F σ con PDF f σ (dove σ sono sconosciuti "parametri di disturbo"), quindi - in assenza di censura - la probabilità logaritmica delle osservazioni ( x i , y i ) èεFσfσσ(xi,yi)
Λ=∑i=1nlogfσ(yi−xiβ).
Con la censura presente possiamo dividere i casi in tre classi (possibilmente vuote): per gli indici a n 1 , y i contiene i valori di soglia più bassi e rappresentano i dati censurati a sinistra ; per gli indici i = n 1 + 1 a n 2 , y i sono quantificati; e per i restanti indici, y i contiene i valori di soglia superiore e rappresentano il diritto censuratoi=1n1yii=n1+1n2yiyidati. La probabilità del registro è ottenuta come prima: è il registro del prodotto delle probabilità.
Λ=∑i=1n1logFσ(yi−xiβ)+∑i=n1+1n2logfσ(yi−xiβ)+∑i=n2+1nlog(1−Fσ(yi−xiβ)).
Questo è massimizzato numericamente in funzione di .(β,σ)
Nella mia esperienza, tali metodi possono funzionare bene quando meno della metà dei dati viene censurata; in caso contrario, i risultati potrebbero essere instabili.
Ecco un semplice R
esempio usando il censReg
pacchetto per illustrare come OLS e risultati censurati possono differire (molto) anche con molti dati. Riproduce qualitativamente i dati nella domanda.
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))
Le cose chiave da notare sono i parametri: la pendenza vera è , l' intercetta vera è - 0,001 e l' errore vero SD è 0,005 .0.005−0.0010.005
Usiamo entrambi lm
e censReg
per adattare una linea:
fit <- censReg(y.cen ~ x, data=data, left=0.0, right=0.01)
summary(fit)
I risultati di questa regressione censurata, dati da print(fit)
, sono
(Intercept) x sigma
-0.001028 0.004935 0.004856
−0.0010.0050.005
fit.OLS <- lm(y.cen ~ x, data=data)
summary(fit.OLS)
La misura OLS, data da print(fit.OLS)
, è
(Intercept) x
0.001996 0.002345
summary
0.002864
Per confronto, limitiamo la regressione ai dati quantificati:
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
Persino peggio!
Alcune immagini riassumono la situazione.
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 nel primo sono stati spostati alle rispettive soglie per produrre il secondo diagramma. Di conseguenza, puoi vedere i dati censurati tutti allineati nella parte inferiore e superiore.
Y0.00320.0037