嗨,我正尝试使用参数t,lambda(比例参数)和k来计算Weibull分布的卷积:
f.x <- function(x,lambda,k){
dweibull(x,k,lambda)
}
cum <- function(T,lambda,k)
{
return(1 - exp(-(T/lambda)^k))
}
F1_t = function(t,lambda,k){
cum(t,lambda,k)
}
F2_t = function(t,lambda,k){
integrate(function(x) F1_t(t-x,lambda,k)*f.x(x,lambda,k),0,t)$value
}
F3_t = function(t, lambda ,k){
integrate(function(x) F2_t(t-x,lambda,k)*f.x(x,lambda,k),0,t)$value
}
其中F2_t和F3_t是第二次和第三次卷积的卷积定义,F2_t可以正常工作,但是当我用以下方法评估F3_t时
F3_t(1,1,2)
我从R收到以下警告:
Error in integrate(function(x) F1_t(t - x, lambda, k) * f.x(x, lambda, :
length(upper) == 1 is not TRUE
我想知道为什么会出现此问题以及如何解决此问题。
答案 0 :(得分:1)
问题在于,与F1_t
不同的是,F2
没有向量化,这意味着它不会为t
的向量返回结果向量。
观察
F1_t(c(1,2), 1, 1)
正常工作,而
F2_t(c(1,2), 1, 1)
失败,因为您无法为integrate
提供积分上限的向量。
因此,解决方案是将F2_t
向量化:
F2_t = function(t,lambda,k){
sapply(t, function(y) integrate(function(x) F1_t(t-x,lambda,k)*f.x(x,lambda,k), lower = 0, upper = y)$value)
}
使用上面F2_t
的代码,F3_t(1,1,2)
运行正常。