Справа з регресією незвично обмеженої змінної реакції


11

Я намагаюся моделювати змінну відповідей, яка теоретично обмежена між -225 та +225. Змінна - це загальна оцінка, яку отримували суб'єкти під час гри. Хоча теоретично суб'єкти можуть набрати +225. Незважаючи на це, оскільки оцінка залежала не тільки від дій суб'єктів, але і від дій інших дій, максимум, кого хто забив - 125 (це два найвищі гравці, які грають один одного, можуть обидва забивати), це сталося з дуже високою частотою. Найнижча оцінка була +35.

Ця межа 125 викликає труднощі з лінійною регресією. Єдине, що я можу подумати, - це повторне масштабування відповіді між 0 і 1 та використання бета-регресії. Якщо я це роблю, хоча я не впевнений, я справді можу виправдати те, що 125 - це верхня межа (або 1 після перетворення), оскільки можна набрати +225. Крім того, якби я зробив це, яка моя нижня межа, 35?

Дякую,

Джонатан


Яка конкретна «складність» виникає при регресуванні цих даних? (Це не відбудеться через теоретичні межі, тому що ваші дані ніде не наближаються до них. Можливо, буде помилкою використовувати метод регресії, наприклад, бета-регресія, який передбачає, що є межі, і ви оцінюєте ці межі з самі дані. )
whuber

Відповіді:


10

Хоча я не зовсім впевнений, у чому полягає ваша проблема з лінійною регресією, я зараз закінчую статтю про те, як аналізувати обмежені результати. Оскільки я не знайомий з бета-регресією, можливо, хтось інший відповість на цей варіант.

З вашого запитання я розумію, що ви отримуєте прогнози поза межами. У цьому випадку я б пішов на логістичну квантильну регресію . Квантильна регресія є дуже акуратною альтернативою регулярній лінійній регресії. Ви можете переглянути різні кванти і отримати набагато кращу картину своїх даних, ніж це можливо при регулярній лінійній регресії. Він також не має припущень щодо розподілу 1 .

Перетворення змінної часто може спричинити смішні наслідки для лінійної регресії, наприклад, ви маєте значення в логістичному перетворенні, але це не перетворюється на регулярне значення. Це не у випадку з квантовами, медіана завжди є медіаною незалежно від функції перетворення. Це дозволяє перетворюватись туди-назад, не спотворюючи нічого. Професор Боттай запропонував такий підхід до обмежених результатів 2 , його відмінний метод, якщо ви хочете робити індивідуальні прогнози, але у нього є деякі проблеми, коли ви не хочете дивитись на бета-версію та інтерпретувати їх нелогістично. Формула проста:

логiт(у)=лог(у+ϵмах(у)-у+ϵ)

Де - ваш рахунок, а - довільна невелика кількість.уϵ

Ось приклад, який я робив деякий час тому, коли хотів експериментувати з ним в 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()

Це дає такий розкид даних, як ви бачите, що це чітко обмежене та незручне :

Розсіювання обмежених даних

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

Це призводить до наступного зображення, коли самки знаходяться вище верхньої межі:

Лінійна регресія порівняно з справжньою лінією

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

Це дає наступний сюжет із подібними проблемами:

Квантильна регресія порівняно з істинною лінією

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

Логістична квантильна регресія, яка має дуже хороший обмежений прогноз:

Логістична квантильна регресія

Тут ви можете побачити проблему з бета-версією, що в ретрансформованому вигляді відрізняються в різних регіонах (як очікувалося):

# 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

Список літератури

  1. Р. Коенкер та Г. Бассетт-молодший, “Квантиси регресії”, Економетрика: журнал Економетричного товариства, с. 33–50, 1978.
  2. М. Боттай, Б. Кай та Р.Е. МакКаун, “Логістична квантильна регресія для обмежених результатів”, Статистика в медицині, т. 29, ні. 2, с. 309–317, 2010.

Для допитливих сюжети були створені за допомогою цього коду:

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

Приємні посилання, ре: бета-регресія Я б запропонував 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 , онлайн- PDF . Він має подібну мотивацію для моделювання розподілів з ефектами підлога / стеля.
Енді Ш

@AndyW: Дякую за вашу довідку, я ніколи не стикався з бета-регресією, але це звучить багатообіцяюче.
Макс Гордон

@MaxGordon Чи знаєте ви, як реалізувати логістичну квантильну регресію? У мене багато особливостей ....
PascalVKooten

@ Двоїнність вибачте, я цього не пробував.
Макс Гордон

@PascalvKooten Я не думаю, що кількісна регресія - найкращий вибір, якщо ви хочете працювати з високопопулярними даними. Я використовую його більше, коли у мене немає такої кількості функцій, але хочу покращити відчуття даних і того, що сприяє результатам в різних регіонах.
Макс Гордон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.