从R中的二项式logit输出计算累积概率

时间:2014-04-17 23:00:25

标签: r probability

我有一个拟合的二项式logit模型,并且想要计算经历事件的累积概率< =协变量的某个值。

例如,如果我有一个基于连续距离范围(0-8.5 km)预测和结果的拟合模型,我可能想要找出距离<= 4.5 km的累积概率。

我有估计概率和相关距离的向量,如下所示

dat <- structure(list(km = c(0, 0.447368421052632, 0.894736842105263, 
1.34210526315789, 1.78947368421053, 2.23684210526316, 2.68421052631579, 
3.13157894736842, 3.57894736842105, 4.02631578947368, 4.47368421052632, 
4.92105263157895, 5.36842105263158, 5.81578947368421, 6.26315789473684, 
6.71052631578947, 7.15789473684211, 7.60526315789474, 8.05263157894737, 
8.5), prob = c(0.99010519543441, 0.985413663823809, 0.97854588563623, 
0.968547716962174, 0.954108659036907, 0.933496091194704, 0.904551377544634, 
0.864833064332603, 0.81202174997839, 0.744668375529677, 0.663191827576796, 
0.570704402277059, 0.47300143764816, 0.377323442817887, 0.290336664745317, 
0.216433162546689, 0.157174982015906, 0.111825887625402, 0.0783449309507567, 
0.054275681518511)), .Names = c("km", "prob"), row.names = c(NA, 
-20L), class = "data.frame")

我最终想要说的是&#34; x距离内x%的观察值预计会经历一个事件&#34;。这是正确的方法吗?

还有一种简单的方法可以计算出哪个距离(从0到0)包含50%的累积概率。

谢谢,蒂姆

1 个答案:

答案 0 :(得分:0)

可能有一些方法可以从你的模型中提取它,但如果你是从头开始我会尝试将你的数据放到一个发行版中,然后提取相关的数据点。

首先定义一个错误函数:

rmse <- function(x,y) sqrt(sum((x-y)^2)/length(x)) # or some other error fxn

现在让我们说你的数据类似于伽玛分布,所以试试:

gdf <- function(x, d=dat$km) pgamma(d,shape=x[1], scale=x[2])

因此,您的优化功能将是数据的误差函数和拟合分布:

error_fxn <- function(x) rmse(rev(dat$prob),gdf(x)) # rev data to make ascending

现在优化此功能以获取感兴趣分布的参数:

rr <- optim(c(1,1),error_fxn)

让我们看看合适有多好(好吧......);

rr
# $par
# [1] 3.108392 1.112584

# $value
# [1] 0.0333369

# $counts
# function gradient 
     119       NA 

# $convergence
# [1] 0

# $message
# NULL

或图解:

with(dat,plot(km,prob,xlim=c(10,0)))
with(dat,lines(rev(km),pgamma(km,shape=rr$par[1], scale=rr$par[2]),col='red'))

enter image description here

看一下CDF的值:

kms <- seq(0,8.5,0.5)
data.frame(dist = kms, cdf = pgamma(kms,shape=rr$par[1], scale=rr$par[2]))

#       dist         cdf
#    1   0.0 0.000000000
#    2   0.5 0.008634055
#    3   1.0 0.053615340
#    4   1.5 0.137291689
#    5   2.0 0.245961242
#    6   2.5 0.363956061
#    7   3.0 0.479070721
#    8   3.5 0.583659363
#    9   4.0 0.673982194
#    10  4.5 0.749075757
#    11  5.0 0.809691054
#    12  5.5 0.857478086
#    13  6.0 0.894431622
#    14  6.5 0.922551998
#    15  7.0 0.943661710
#    16  7.5 0.959325076
#    17  8.0 0.970830577
#    18  8.5 0.979207658

要回答你的最后一个问题,请将距离保持在CDF的50%:

qgamma(0.5,shape=rr$par[1], scale=rr$par[2])
# [1] 3.095395