我对上一篇文章提出了类似的挑战:How to pass vector to integrate function
我有一个功能,我想整合曲线下的区域。
首先,[生存]功能:
surv <- function(x,score) exp(-0.0405*exp(score)*x) # probability of survival
score
来自风险计算器,它会调整生存估计值。患者有不同的分数,例如:
score <- c(0.5, 0.6, 0.7, 0.8, 0.9, 1, 1.1) # 7 different scores
如果我们有一个特定的时间点surv
,那么计算所有7名患者的x
很容易:
surv(5, score) # Survival to year 5
[1] 0.7161497 0.6914399 0.6651219 0.6371998 0.6077026 0.5766890 0.5442516
但是为了获得人口的平均存活率或个体的预期存活率,我需要计算曲线下面积,其中曲线由函数surv
给出。我需要在x=0
和x=Inf
的限制范围内计算面积。我需要为所有7名(在这个例子中)患者做这件事。
我引用的另一个stackoverflow帖子也有类似的问题。目前尚不清楚该解决方案能否对我有所帮助。我在下面介绍:
integrate(Vectorize(fun_integrate,vectorize.args='x'), upper = 3, lower = -3, vec = rnorm(100),subdivisions=10000)
fun_integrate
是要整合的功能
vectorize.args
是被矢量化并传递给fun_integrate
vec
是值的向量,用作要传递给fun_integrate的参数
我不知道哪些细分是,但我认为它并不重要。
我尝试使用以下内容执行此操作:
integrate(Vectorize(surv, vectorize.args="score"), lower=0, upper=Inf, score=score)
Error in integrate(Vectorize(surv, vectorize.args = "score"), lower = 0, :
evaluation of function gave a result of wrong length
我尝试了不同的修改,似乎没有任何结果。
你有什么建议吗?
答案 0 :(得分:4)
您以错误的顺序执行此操作。您需要创建一个函数来计算给定分数的积分,并将其矢量化。
surv <- function(x,score) exp(-0.0405*exp(score)*x) # probability of survival
area <- function(score) integrate(surv,lower=0,upper=Inf,score=score)$value
v.area <- Vectorize(area)
scores <- c(0.5, 0.6, 0.7, 0.8, 0.9, 1, 1.1) # 7 different scores
v.area(scores)
# [1] 14.976066 13.550905 12.261366 11.094542 10.038757 9.083443 8.219039