我希望从使用mgcv::gam(..., family = ocat(R = ...))
构造的有序回归模型中获得预测概率的置信区间,但是很难弄清楚该如何做。我的尝试如下。
我创建了一个示例数据集,并使用gam()
建立了序数回归。请注意,x
已排序。
library("mgcv")
set.seed(1)
d <- data.frame(
y = sample(1:5, size = 200, replace = TRUE),
x = sort(runif(200))
)
d.gam <- gam(y ~ x, family = ocat(R = 5), data = d)
如果我使用predict.gam(..., type = "response")
,则会为每个观察值获得每个类别的预测概率矩阵。由于x
作为线性项包含在内,因此预测的概率也是单调的(例如,类别1的概率持续减小,而类别4的概率持续增大)。到目前为止一切顺利。
> d.response <- predict(d.gam, d, se = TRUE, type = "response")
> d.response$fit[c(1:3, 100:103, 198:200), ]
[,1] [,2] [,3] [,4] [,5]
1 0.1533162 0.2327623 0.2160818 0.2333859 0.1644538
2 0.1529262 0.2324397 0.2160737 0.2336929 0.1648675
3 0.1528949 0.2324138 0.2160730 0.2337176 0.1649007
100 0.1452906 0.2259199 0.2157159 0.2397503 0.1733233
101 0.1451200 0.2257698 0.2157034 0.2398865 0.1735203
102 0.1451026 0.2257544 0.2157021 0.2399005 0.1735405
103 0.1451008 0.2257528 0.2157020 0.2399019 0.1735425
198 0.1342714 0.2158035 0.2144608 0.2486086 0.1868556
199 0.1342414 0.2157748 0.2144561 0.2486328 0.1868948
200 0.1341483 0.2156856 0.2144414 0.2487081 0.1870167
但是,标准错误不是这种情况。
> d.response$se.fit[c(1:3, 100:103, 198:200), ]
[,1] [,2] [,3] [,4] [,5]
1 0.03015269 0.02490338 0.0005903245 0.02372872 0.03191767
2 0.02918116 0.02417559 0.0006422390 0.02298270 0.03101629
3 0.02910391 0.02411755 0.0006462272 0.02292332 0.03094436
100 0.01574518 0.01384974 0.0011449970 0.01257287 0.01816704
101 0.01566419 0.01379678 0.0011579659 0.01251146 0.01810748
102 0.01565671 0.01379206 0.0011593446 0.01250581 0.01810230
103 0.01565595 0.01379159 0.0011594855 0.01250525 0.01810178
198 0.03108344 0.02975641 0.0048968388 0.02510754 0.04062915
199 0.03115134 0.02982819 0.0049153610 0.02516275 0.04073214
200 0.03136282 0.03005193 0.0049732667 0.02533468 0.04105333
首先,我什至不确定这是否真的在概率范围内。如果是这样,为什么比例看起来会因类别而异(例如,类别3的SE比类别5的SE小得多)?同样,SE首先下降,然后随着x
的上升而上升。由于数据据推测沿x
均匀分布,因此我预计沿x
会有相似的SE。为什么不是这种情况?
由于上述过程中可能存在错误,因此我认为我应该基于线性预测变量(predict(..., type = "link")
)得出SE。但是,与上述情况不同,predict(..., type = "link")
为每个观察值返回一个值,因此我无法弄清线性预测变量和每个类别的概率之间的关系。
> d.link <- predict(d.gam, d, se = TRUE, type = "link")
> head(d.link$fit)
1 2 3 4 5 6
0.7088250 0.7118324 0.7120737 0.7124732 0.7143695 0.7146253
> head(d.link$se.fit)
1 2 3 4 5 6
0.2322826 0.2252680 0.2247092 0.2237855 0.2194252 0.2188400
所以我的问题如下:
predict.gam(..., type = "response")$se.fit
返回的值是否在概率标度中?如果不是,那是什么?predict.gam(..., type = "link")
的输出得出每个类别的概率吗?如果可以,怎么办?提前谢谢!