Umgang mit der Regression ungewöhnlich begrenzter Antwortvariablen

11

Ich versuche, eine Antwortvariable zu modellieren, die theoretisch zwischen -225 und +225 liegt. Die Variable ist die Gesamtpunktzahl, die die Probanden beim Spielen eines Spiels erhalten haben. Obwohl es theoretisch möglich ist, dass Probanden +225 Punkte erzielen. Trotzdem geschah dies mit einer sehr hohen Häufigkeit, da die Punktzahl nicht nur von den Aktionen des Subjekts abhing, sondern auch von den Aktionen anderer Aktionen. Das Maximum war 125 Punkte (dies sind die höchsten 2 Spieler, die gegeneinander spielen und beide Punkte erzielen können). Dies geschah mit einer sehr hohen Häufigkeit. Die niedrigste Punktzahl war +35.

Diese Grenze von 125 verursacht Schwierigkeiten mit einer linearen Regression. Das einzige, was ich mir vorstellen kann, ist die Neuskalierung der Antwort auf 0 bis 1 und die Verwendung einer Beta-Regression. Wenn ich dies tue, obwohl ich nicht sicher bin, ob ich wirklich rechtfertigen kann, dass 125 die oberste Grenze (oder 1 nach der Transformation) ist, da es möglich ist, +225 zu erzielen. Wenn ich das tun würde, was wäre dann meine untere Grenze, 35?

Vielen Dank,

Jonathan

Jonathan Bone
quelle
Welche spezifischen "Schwierigkeiten" treten bei der Regression dieser Daten auf? (Dies liegt nicht an den theoretischen Grenzen, da Ihre Daten nicht in die Nähe dieser Grenzen kommen. Es wäre wahrscheinlich ein Fehler, eine Regressionsmethode wie die Beta-Regression zu verwenden, bei der davon ausgegangen wird, dass es Grenzen gibt, und Sie schätzen diese Grenzen anhand der Grenzen Daten selbst. )
whuber

Antworten:

10

Obwohl ich nicht ganz sicher bin, was Ihr Problem mit der linearen Regression ist, beende ich gerade einen Artikel über die Analyse begrenzter Ergebnisse. Da ich mit der Beta-Regression nicht vertraut bin, wird möglicherweise jemand anderes diese Option beantworten.

Unter Ihrer Frage verstehe ich, dass Sie Vorhersagen außerhalb der Grenzen erhalten. In diesem Fall würde ich mich für eine logistische Quantilregression entscheiden . Quantile Regression ist eine sehr gute Alternative zur regulären linearen Regression. Sie können verschiedene Quantile betrachten und ein viel besseres Bild Ihrer Daten erhalten, als dies mit einer regulären linearen Regression möglich ist. Es gibt auch keine Annahmen bezüglich der Verteilung 1 .

Die Transformation einer Variablen kann häufig lustige Auswirkungen auf die lineare Regression haben. Beispielsweise haben Sie eine Bedeutung für die logistische Transformation, die sich jedoch nicht in den regulären Wert umsetzt. Dies ist bei Quantilen nicht der Fall , der Median ist unabhängig von der Transformationsfunktion immer der Median. Auf diese Weise können Sie sich hin und her verwandeln, ohne etwas zu verzerren. Prof. Bottai schlug diesen Ansatz für begrenzte Ergebnisse 2 vor. Dies ist eine hervorragende Methode, wenn Sie individuelle Vorhersagen treffen möchten, aber es gibt einige Probleme, wenn Sie die Beta-Versionen nicht betrachten und nicht logistisch interpretieren möchten. Die Formel ist einfach:

logit(y)=log(y+ϵmax(y)y+ϵ)

Wobei Ihre Punktzahl ist und eine beliebige kleine Zahl ist.ϵyϵ

Hier ist ein Beispiel, das ich vor einiger Zeit gemacht habe, als ich in R damit experimentieren wollte:

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()

Dies ergibt die folgende Datenstreuung, wie Sie sehen können, ist sie klar begrenzt und unpraktisch :

Streuung von begrenzten Daten

###################################
# 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)

Dies führt zu folgendem Bild, in dem sich die Weibchen deutlich über der oberen Grenze befinden:

Lineare Regression im Vergleich zur wahren Linie

# 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)

Dies ergibt die folgende Darstellung mit ähnlichen Problemen:

Quantile Regression im Vergleich zur wahren Linie

# 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)

Die logistische Quantilregression, die eine sehr schöne begrenzte Vorhersage hat:

Die logistische Quantilregression

Hier sehen Sie das Problem mit den Beta-Versionen, die sich in der retransformierten Weise in verschiedenen Regionen unterscheiden (wie erwartet):

# 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

Verweise

  1. R. Koenker und G. Bassett Jr., "Regression Quantiles", Econometrica: Journal of the Econometric Society, S. 33–50, 1978.
  2. M. Bottai, B. Cai und RE McKeown, "Logistische Quantilregression für begrenzte Ergebnisse", Statistics in Medicine, vol. 29, nein. 2, S. 309–317, 2010.

Für die Neugierigen wurden die Handlungen mit diesem Code erstellt:

# 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
quelle
Schöne Referenzen, Re: Beta-Regression würde ich vorschlagen 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 , Online- PDF . Es hat eine ähnliche Motivation für die Modellierung von Verteilungen mit Boden- / Deckeneffekten.
Andy W
@AndyW: Vielen Dank für Ihre Referenz, ich bin noch nie auf eine Beta-Regression gestoßen, aber es klingt vielversprechend.
Max Gordon
@MaxGordon Kennen Sie eine Möglichkeit, die logistische Quantil-Ridge-Regression zu implementieren? Ich habe viele Funktionen ....
PascalVKooten
@Dualinity sorry, das habe ich nicht ausprobiert.
Max Gordon
@PascalvKooten Ich denke nicht, dass Quantilregression die beste Wahl ist, wenn Sie mit Daten mit hohen Funktionen arbeiten möchten. Ich benutze es häufiger, wenn ich nicht so viele Funktionen habe, aber ein besseres Gefühl für die Daten und die Ergebnisse in den verschiedenen Regionen bekommen möchte.
Max Gordon