แม้ว่าฉันจะไม่แน่ใจว่าปัญหาของคุณเกี่ยวกับการถดถอยเชิงเส้นคืออะไรตอนนี้ฉันกำลังเขียนบทความเกี่ยวกับวิธีการวิเคราะห์ผลลัพธ์ที่มีขอบเขต เนื่องจากฉันไม่คุ้นเคยกับการถดถอยเบต้าบางทีคนอื่นจะตอบตัวเลือกนั้น
ตามคำถามของคุณฉันเข้าใจว่าคุณได้รับการทำนายนอกขอบเขต ในกรณีนี้ผมจะไปสำหรับการถดถอยโลจิสติก quantile การถดถอยเชิงปริมาณเป็นทางเลือกที่ดีมากสำหรับการถดถอยเชิงเส้นปกติ คุณสามารถดูปริมาณที่แตกต่างกันและรับข้อมูลของคุณได้ดีกว่าที่เป็นไปได้ด้วยการถดถอยเชิงเส้นปกติ มันก็ยังไม่เคยมีใครสมมติฐานเกี่ยวกับการกระจาย1
การเปลี่ยนแปลงของตัวแปรมักจะทำให้เกิดผลกระทบที่ตลกขบขันกับการถดถอยเชิงเส้นเช่นคุณมีความสำคัญในการแปลงโลจิสติกส์ แต่นั่นไม่ได้แปลเป็นค่าปกติ นี่ไม่ใช่กรณีที่มี quantiles ค่ามัธยฐานเป็นค่ามัธยฐานเสมอโดยไม่คำนึงถึงฟังก์ชันการแปลง สิ่งนี้ทำให้คุณสามารถแปลงไปมาได้โดยไม่บิดเบือนอะไรเลย Prof. Bottai แนะนำวิธีนี้ในการ จำกัด ผลลัพธ์2ซึ่งเป็นวิธีการที่ยอดเยี่ยมหากคุณต้องการทำการคาดการณ์รายบุคคล แต่มีปัญหาบางอย่างเมื่อคุณไม่ต้องการดูเบต้าและตีความในลักษณะที่ไม่ใช่โลจิสติกส์ สูตรง่าย:
l o gฉันt ( y) = l o g( y+ ϵm a x ( y) - y+ ϵ)
Yε
นี่คือตัวอย่างที่ฉันทำเมื่อไม่นานมานี้เมื่อฉันต้องการทดลองใช้ใน 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
อ้างอิง
- R. Koenker และ G. Bassett Jr, "Regiments quantiles," Econometrica: วารสารของสมาคมเศรษฐมิติ, หน้า 33–50, 1978
- M. Bottai, B. Cai, และ RE McKeown,“ Logistic quantile regression สำหรับผลลัพธ์ที่มีขอบเขต,” สถิติทางการแพทย์, ฉบับที่, 29, ไม่มี 2, pp. 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()