使用自助法进行分位数回归的置信区间

3

我正在尝试获取线性和分位数回归的五种Bootstrap区间类型。我能够使用car中的Boot和boot中的boot.ci进行Bootstrap并找到线性回归的5个Bootstrap区间(Quantile、Normal、Basic、Studentized和BCa)。但是,当我尝试使用quantreg中的rq进行分位数回归时,它会报错。以下是示例代码。

创建模型

library(car)
library(quantreg)
library(boot)
newdata = Prestige[,c(1:4)]
education.c = scale(newdata$education, center=TRUE, scale=FALSE)
prestige.c = scale(newdata$prestige, center=TRUE, scale=FALSE)
women.c = scale(newdata$women, center=TRUE, scale=FALSE)
new.c.vars = cbind(education.c, prestige.c, women.c)
newdata = cbind(newdata, new.c.vars)
names(newdata)[5:7] = c("education.c", "prestige.c", "women.c" )
mod1 = lm(income ~ education.c + prestige.c + women.c, data=newdata)
mod2 = rq(income ~ education.c + prestige.c + women.c, data=newdata)

启动线性和分位数回归

mod1.boot <- Boot(mod1, R=999)
boot.ci(mod1.boot, level = .95, type = "all")
dat2 <- newdata[5:7]
mod2.boot <- boot.rq(cbind(1,dat2),newdata$income,tau=0.5, R=10000)
boot.ci(mod2.boot, level = .95, type = "all")
Error in if (ncol(boot.out$t) < max(index)) { : 
argument is of length zero

1) 为什么boot.ci不能用于分位数回归?

2) 使用我从stackexchange得到的解决方案,我能够找到分位数置信区间。

rq的分位数(百分位数)置信区间的解决方案

t(apply(mod2.boot$B, 2, quantile, c(0.025,0.975)))

我该如何获得bootstrap的其他CI(正常、基本、学生化、BCa)。

3)此外,我的线性回归boot.ci命令产生了这个警告。

Warning message:
In sqrt(tv[, 2L]) : NaNs produced

这代表什么?
2个回答

3
使用summary.rq,您可以计算模型系数的自助法标准误差。
有五种自助法方法可供选择(请参见?boot.rq)。
summary(mod2, se = "boot", bsmethod= "xy")

# Call: rq(formula = income ~ education.c + prestige.c + women.c, data = newdata)
# 
# tau: [1] 0.5
#  
# Coefficients:
#             Value      Std. Error t value    Pr(>|t|)  
# (Intercept) 6542.83599  139.54002   46.88860    0.00000
# education.c  291.57468  117.03314    2.49139    0.01440
# prestige.c    89.68050   22.03406    4.07009    0.00010
# women.c      -48.94856    5.79470   -8.44712    0.00000

为了计算Bootstrap置信区间,您可以使用以下技巧:
mod1.boot <- Boot(mod1, R=999)
set.seed(1234)
boot.ci(mod1.boot, level = .95, type = "all")

dat2 <- newdata[5:7]
set.seed(1234)
mod2.boot <- boot.rq(cbind(1,dat2),newdata$income,tau=0.5, R=10000)

# Create an object with the same structure of mod1.boot
# but with boostrap replicates given by boot.rq
mod3.boot <- mod1.boot
mod3.boot$R <- 10000
mod3.boot$t0 <- coef(mod2)
mod3.boot$t <- mod2.boot$B
boot.ci(mod3.boot, level = .95, type = "all")

# BOOTSTRAP CONFIDENCE INTERVAL CALCULATIONS
# Based on 10000 bootstrap replicates
# 
# CALL : 
# boot.ci(boot.out = mod3.boot, type = "all", level = 0.95)
# 
# Intervals : 
# Level      Normal              Basic             Studentized     
# 95%   (6293, 6838 )   (6313, 6827 )   (6289, 6941 )  
# 
# Level     Percentile            BCa          
# 95%   (6258, 6772 )   (6275, 6801 )  

谢谢你的解决方案,但我已经想出了一个更通用的解决方案来计算所有变量的CI。再次感谢! - Interested_Programmer

0
感谢所有帮助过我的人。我最终自己找到了解决方案。我运行了一个循环来计算分位数回归的系数,然后分别使用了boot和boot.ci。以下是代码:

仅引用启动命令,模型创建来自问题

mod3 <- formula(income ~ education.c + prestige.c + women.c)
coefsf <- function(data,ind){
rq(mod3, data=newdata[ind,])$coef
}
boot.mod <- boot(newdata,coefsf,R=10000)
myboot.ci <- list()
for (i in 1:ncol(boot.mod$t)){
myboot.ci[[i]] <- boot.ci(boot.mod, level = .95, type = 
c("norm","basic","perc", "bca"),index = i)
  }

我这样做是因为我想要对所有变量进行CI,而不仅仅是截距。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接