Lidando com a regressão da variável de resposta invulgarmente limitada

11

Estou tentando modelar uma variável de resposta que é teoricamente limitada entre -225 e +225. A variável é a pontuação total obtida pelos sujeitos ao jogar um jogo. Embora teoricamente seja possível para os sujeitos pontuar +225. Apesar disso, porque a pontuação dependia não apenas das ações dos sujeitos, mas também das ações de outras ações, o máximo que alguém marcou foi 125 (este é o maior número de jogadores que podem se marcar), isso aconteceu com uma frequência muito alta. A pontuação mais baixa foi +35.

Esse limite de 125 está causando dificuldades com uma regressão linear. A única coisa que consigo pensar é redimensionar a resposta para estar entre 0 e 1 e usar uma regressão beta. Se fizer isso, não tenho certeza se realmente posso justificar dizer que 125 é o limite superior (ou 1 após a transformação), pois é possível marcar +225. Além disso, se eu fizesse isso, qual seria meu limite inferior, 35?

Obrigado,

Jonathan

Jonathan Bone
fonte
Que "dificuldade" específica está surgindo na regressão desses dados? (Isso não se deve aos limites teóricos, porque seus dados não chegam nem perto deles. Provavelmente seria um erro usar um método de regressão, como a regressão Beta, que pressupõe limites e você os estima a partir de próprios dados. )
whuber

Respostas:

10

Embora eu não tenha muita certeza de qual é o seu problema com a regressão linear, agora estou terminando um artigo sobre como analisar resultados limitados. Como não estou familiarizado com a regressão beta, talvez alguém responda a essa opção.

Pela sua pergunta, entendo que você obtém previsões fora dos limites. Nesse caso, eu usaria regressão logística quantílica . A regressão quantílica é uma alternativa muito elegante à regressão linear regular. Você pode observar diferentes quantis e obter uma imagem muito melhor dos seus dados do que é possível com a regressão linear regular. Também não há suposições sobre a distribuição 1 .

A transformação de uma variável geralmente pode causar efeitos engraçados na regressão linear, por exemplo, você tem um significado na transformação logística, mas isso não se traduz no valor regular. Esse não é o caso dos quantis, a mediana é sempre a mediana, independentemente da função de transformação. Isso permite que você se transforme sem distorcer nada. O professor Bottai sugeriu essa abordagem para resultados limitados 2 , é um método excelente se você deseja fazer previsões individuais, mas há alguns problemas quando você não deseja olhar para os beta e interpretá-los de maneira não logística. A fórmula é simples:

euogEut(y)=euog(y+ϵmumax(y)-y+ϵ)

yϵ

Aqui está um exemplo que eu fiz há um tempo atrás, quando eu queria experimentar com ele em R:

library(rms)
library(lattice)
library(cairoDevice)
library(ggplot2)

# Simulate some data
set.seed(10)
intercept <- 0
beta1 <- 0.5
beta2 <- 1
n = 1000
xtest <- rnorm(n,1,1)
gender <- factor(rbinom(n, 1, .4), labels=c("Male", "Female"))
random_noise  <- runif(n, -1,1)

# Add a ceiling and a floor to simulate a bound score
fake_ceiling <- 4
fake_floor <- -1

# Simulate the predictor
linpred <- intercept + beta1*xtest^3 + beta2*(gender == "Female") + random_noise

# Remove some extremes
extreme_roof <- fake_ceiling + abs(diff(range(linpred)))/2
extreme_floor <- fake_floor - abs(diff(range(linpred)))/2
linpred[ linpred > extreme_roof|
    linpred < extreme_floor ] <- NA

#limit the interval and give a ceiling and a floor effect similar to scores
linpred[linpred > fake_ceiling] <- fake_ceiling
linpred[linpred < fake_floor] <- fake_floor

# Just to give the graphs the same look
my_ylim <- c(fake_floor - abs(fake_floor)*.25, 
             fake_ceiling + abs(fake_ceiling)*.25)
my_xlim <- c(-1.5, 3.5)

# Plot
df <- data.frame(Outcome = linpred, xtest, gender)
ggplot(df, aes(xtest, Outcome, colour = gender)) + geom_point()

Isso fornece a seguinte dispersão de dados, como você pode ver, é claramente limitada e inconveniente :

Dispersão de dados limitados

###################################
# Calculate & plot the true lines #
###################################
x <- seq(min(xtest), max(xtest), by=.1)
y <- beta1*x^3+intercept
y_female <- y + beta2
y[y > fake_ceiling] <- fake_ceiling
y[y < fake_floor] <- fake_floor
y_female[y_female > fake_ceiling] <- fake_ceiling
y_female[y_female < fake_floor] <- fake_floor

tr_df <- data.frame(x=x, y=y, y_female=y_female)
true_line_plot <- xyplot(y  + y_female ~ x, 
                         data=tr_df,
                         type="l", 
                         xlim=my_xlim, 
                         ylim=my_ylim, 
                         ylab="Outcome", 
                         auto.key = list(
                           text = c("Male"," Female"),
                           columns=2))

##########################
# Test regression models #
##########################

# Regular linear regression
fit_lm <- Glm(linpred~rcs(xtest, 5)+gender, x=T, y=T)
boot_fit_lm <- bootcov(fit_lm, B=500)
p <- Predict(boot_fit_lm, xtest=seq(-2.5, 3.5, by=.001), gender=c("Male", "Female"))
lm_plot <- plot(p, 
             se=T, 
             col.fill=c("#9999FF", "#BBBBFF"), 
             xlim=my_xlim, ylim=my_ylim)

Isso resulta na figura a seguir, onde as fêmeas estão claramente acima do limite superior:

Regressão linear comparada à linha verdadeira

# Quantile regression - regular
fit_rq <- Rq(formula(fit_lm), x=T, y=T)
boot_rq <- bootcov(fit_rq, B=500)
# A little disturbing warning:
# In rq.fit.br(x, y, tau = tau, ...) : Solution may be nonunique

p <- Predict(boot_rq, xtest=seq(-2.5, 3.5, by=.001), gender=c("Male", "Female"))
rq_plot <- plot(p, 
             se=T, 
             col.fill=c("#9999FF", "#BBBBFF"), 
             xlim=my_xlim, ylim=my_ylim)

Isso fornece o seguinte gráfico com problemas semelhantes:

Regressão quantil comparada à linha verdadeira

# The logit transformations
logit_fn <- function(y, y_min, y_max, epsilon)
    log((y-(y_min-epsilon))/(y_max+epsilon-y))


antilogit_fn <- function(antiy, y_min, y_max, epsilon)
    (exp(antiy)*(y_max+epsilon)+y_min-epsilon)/
        (1+exp(antiy))

epsilon <- .0001
y_min <- min(linpred, na.rm=T)
y_max <- max(linpred, na.rm=T)

logit_linpred <- logit_fn(linpred, 
                            y_min=y_min,
                            y_max=y_max,
                            epsilon=epsilon)

fit_rq_logit <- update(fit_rq, logit_linpred ~ .)
boot_rq_logit <- bootcov(fit_rq_logit, B=500)

p <- Predict(boot_rq_logit, 
             xtest=seq(-2.5, 3.5, by=.001), 
             gender=c("Male", "Female"))

# Change back to org. scale
# otherwise the plot will be
# on the logit scale
transformed_p <- p
transformed_p$yhat <- antilogit_fn(p$yhat,
                                    y_min=y_min,
                                    y_max=y_max,
                                    epsilon=epsilon)
transformed_p$lower <- antilogit_fn(p$lower, 
                                     y_min=y_min,
                                     y_max=y_max,
                                     epsilon=epsilon)
transformed_p$upper <- antilogit_fn(p$upper, 
                                     y_min=y_min,
                                     y_max=y_max,
                                     epsilon=epsilon)

logit_rq_plot <- plot(transformed_p, 
             se=T, 
             col.fill=c("#9999FF", "#BBBBFF"), 
             xlim=my_xlim)

A regressão logística quantílica que tem uma previsão limitada muito boa:

A regressão logística quantílica

Aqui você pode ver o problema das versões beta que, de maneira retransformada, diferem em diferentes regiões (conforme o esperado):

# Some issues trying to display the gender factor
contrast(boot_rq_logit, list(gender=levels(gender), 
                             xtest=c(-1:1)), 
         FUN=function(x)antilogit_fn(x, epsilon))

   gender xtest Contrast   S.E.       Lower      Upper       Z      Pr(>|z|)
   Male   -1    -2.5001505 0.33677523 -3.1602179 -1.84008320  -7.42 0.0000  
   Female -1    -1.3020162 0.29623080 -1.8826179 -0.72141450  -4.40 0.0000  
   Male    0    -1.3384751 0.09748767 -1.5295474 -1.14740279 -13.73 0.0000  
*  Female  0    -0.1403408 0.09887240 -0.3341271  0.05344555  -1.42 0.1558  
   Male    1    -1.3308691 0.10810012 -1.5427414 -1.11899674 -12.31 0.0000  
*  Female  1    -0.1327348 0.07605115 -0.2817923  0.01632277  -1.75 0.0809  

Redundant contrasts are denoted by *

Confidence intervals are 0.95 individual intervals

Referências

  1. R. Koenker e G. Bassett Jr, "Regression quantiles", Econometrica: jornal da Econometric Society, pp. 33–50, 1978.
  2. M. Bottai, B. Cai e RE McKeown, "Regressão quantílica logística para resultados limitados", Statistics in Medicine, vol. 29, n. 2, pp. 309–317, 2010.

Para os curiosos, as parcelas foram criadas usando este código:

# Just for making pretty graphs with the comparison plot
compareplot <- function(regr_plot, regr_title, true_plot){
  print(regr_plot, position=c(0,0.5,1,1), more=T)
  trellis.focus("toplevel")
  panel.text(0.3, .8, regr_title, cex = 1.2, font = 2)
  trellis.unfocus()
  print(true_plot, position=c(0,0,1,.5), more=F)
  trellis.focus("toplevel")
  panel.text(0.3, .65, "True line", cex = 1.2, font = 2)
  trellis.unfocus()
}

Cairo_png("Comp_plot_lm.png", width=10, height=14, pointsize=12)
compareplot(lm_plot, "Linear regression", true_line_plot)
dev.off()

Cairo_png("Comp_plot_rq.png", width=10, height=14, pointsize=12)
compareplot(rq_plot, "Quantile regression", true_line_plot)
dev.off()

Cairo_png("Comp_plot_logit_rq.png", width=10, height=14, pointsize=12)
compareplot(logit_rq_plot, "Logit - Quantile regression", true_line_plot)
dev.off()

Cairo_png("Scat. plot.png")
qplot(y=linpred, x=xtest, col=gender, ylab="Outcome")
dev.off()
Max Gordon
fonte
Agradáveis referências, re: regressão beta eu sugeriria Smithson, M. and Verkuilen, J. (2006). A better lemon squeezer? maximum-likelihood regression with beta-distributed dependent variables. Psychological Methods, 11(1):54-71., DOI , em linha PDF . Tem uma motivação semelhante para modelar distribuições com efeitos de piso / teto.
Andy W
@ AndyW: Obrigado pela sua referência, nunca encontrei regressão beta, mas parece promissor.
Max Gordon
@MaxGordon Você conhece uma maneira de implementar a Regressão Logística Quantil Ridge? Eu tenho um monte de recursos ....
PascalVKooten
@Dualinity desculpe, eu não tentei isso.
Max Gordon
@PascalvKooten Não acho que a regressão quantílica seja a melhor opção se você quiser trabalhar com dados de alto desempenho. Uso-o mais quando não tenho muitos recursos, mas quero ter uma ideia melhor dos dados e do que está gerando os resultados nas diferentes regiões.
Max Gordon