分位数回归和 p 值 - 获得更多小数位

Luk*_*uke 5 regression r quantile quantreg

使用 R 和包quantreg,我正在对我的数据执行分位数回归分析。

我可以使用汇总函数中的 se(标准误差)估计器来访问 p 值,如下所示,但是我只能得到 5 位小数,并且想要更多。

model <- rq(outcome ~ predictor)
summary(model, se="ker")

Call: rq(formula = outcome ~ predictor)

tau: [1] 0.5

Coefficients:
            Value    Std. Error t value  Pr(>|t|)
(Intercept) 78.68182  2.89984   27.13312  0.00000
predictor    0.22727  0.03885    5.84943  0.00000
Run Code Online (Sandbox Code Playgroud)

如何获取 p 值的更多小数位?


更新

好的,所以我可以通过选择包含数值结果矩阵的子对象来获得更多的小数位;

> summary(model, se="ker")[[3]]
                 Value Std. Error   t value     Pr(>|t|)
(Intercept) 78.6818182 3.13897835 25.066059 0.000000e+00
predictor    0.2272727 0.04105681  5.535567 4.397638e-08
Run Code Online (Sandbox Code Playgroud)

然而,当该值 <1e-12 时,P 值仍四舍五入为 0(以上输出是简化的示例模型)。通过应用 @seancarmody 的建议,我可以得到更多;

format(summary(model, se="ker")[[3]], digits=22)
Run Code Online (Sandbox Code Playgroud)

但如果 P < 1e-22 它仍然四舍五入为 0,并且如果“digits”设置为 > 22 我会收到以下错误;

format(summary(model, se="ker")[[3]], digits=23)
Run Code Online (Sandbox Code Playgroud)

PrettyNum(.Internal(format(x,trim,digits,nsmall,width,3L,:无效的“digits”参数)中的错误

是否可以访问更多的小数位?

sea*_*ody 5

看一下str(model)。您可以看到有一个属性coefficients,它将为您提供比摘要显示的精度更高的数字向量。您还可以查看这些

format(model$coefficients, digits=12)
Run Code Online (Sandbox Code Playgroud)

请注意,这会将系数转换为字符串。

要更仔细地检查 p.values,请尝试

summary(model, se="ker")$coefficients[,1]*1e27
Run Code Online (Sandbox Code Playgroud)

尽管我非常怀疑 p.value 小于 1e-27 的数字是否有任何意义!


Ben*_*ker 2

为了更进一步,我认为你必须深入研究 p 值是如何计算的。特别是,summary.rq有以下片段:

  coef[, 4] <- if (rdf > 0) 
        2 * (1 - pt(abs(coef[, 3]), rdf))
    else NA
Run Code Online (Sandbox Code Playgroud)

这实际上是对 p 值的相当不精确的计算(在通常情况下并不重要)。您可能可以通过检索 p 值的对数来获得最大精度[例如,原则上您可以检索小于 10^{-308} 的 p 值,即 R 可以表示为双精度的最小值精度值],例如

ss <- summary(model,se="ker")
log(2)+pt(abs(ss$coefficients[,"t value"]),
     lower.tail=FALSE,log.p=TRUE,df=ss$rdf)
Run Code Online (Sandbox Code Playgroud)

lower.tail=FALSE参数为您提供 CDF 的补(上尾)值;log.p=TRUE说你想要日志值;添加log(2)使其成为双面的。