将函数矢量化以便在R中使用Integrate
我正在建立一个随机变量的pdf,为了做到这一点,我需要计算一个函数的积分。pdf如下图所示,我特意将指数分开,以便更容易阅读和区分与集成下的将函数矢量化以便在R中使用Integrate,r,integration,vectorization,numerical-methods,integrate,R,Integration,Vectorization,Numerical Methods,Integrate,我正在建立一个随机变量的pdf,为了做到这一点,我需要计算一个函数的积分。pdf如下图所示,我特意将指数分开,以便更容易阅读和区分与集成下的x相关的部分 已知alpha、beta和miu的值,并对t_k的值进行求和,这些值也被给出并称为 我读过无数关于如何在R中使用矢量化的帖子、ppt演示等,但我不得不承认,我仍然不明白那里发生了什么 我以为我已经在代码中解决了这个问题,但是当我使用这里提供的数据集运行它时() testintegrate需要能够接受x值向量并生成y值向量。。。因此需要对被积
x
相关的部分
已知alpha、beta和miu
的值,并对t_k
的值进行求和,这些值也被给出并称为
我读过无数关于如何在R中使用矢量化的帖子、ppt演示等,但我不得不承认,我仍然不明白那里发生了什么
我以为我已经在代码中解决了这个问题,但是当我使用这里提供的数据集运行它时()
testintegrate
需要能够接受x值向量并生成y值向量。。。因此需要对被积函数进行“矢量化”。@BondedDost我知道有两种方法可以确保用户定义的函数“矢量化”:一种是使用“矢量化”命令(就像我尝试过的那样),另一种是重新编写函数,对吗?但是,以“矢量化”形式重新编写函数意味着什么呢?无论函数在何处求值,函数的方程都是相同的吗?如果在表达式中使用所有向量化函数,那么返回的对象将是相同长度的向量。(sum
不是“向量化的”,而是+
是。)所以,区别在于如果我有一个向量,比如说Bha,你的意思是如果我做sum(c(1,2,3),c(5,6,7))
我得到的是一个数字而不是一个向量吗?
Warning messages:
1: In values[i] <- integrate(Vectorize(integrand, vectorize.args = "x"), ... :
number of items to replace is not a multiple of replacement length$
## Pdf function for the random variable (1-D)
probability.function=function(paramss, event.times, length.interval, granularity.interval) {
tt<-sort(event.times)
li<-length.interval
gi<-granularity.interval
s<-seq(tail(tt,1), tail(tt,1)+li, by=gi) #seed.times on which I compute the value of the pdF (starting point is the last occurence time)
parr1<-paramss[1]
parr2<-paramss[2]
parr3<-paramss[3]
integrand <- function(x, top, params, data, seed.time) {
t<-sort(data)
par1<-params[1]
par2<-params[2]
par3<-params[3]
top<-top
s<-seed.time
value <- (par1 + sum(par2*exp(-par3*(x - t)))) *
(par1 + sum(par2*exp(-par3*(top - t))) + par2*exp(-par3*(top - x))) *
exp(-par1*(x-tail(t,1))) *
exp(-par2/par3*sum(exp(-par3*(tail(t,1)-t)) - exp(-par3*(top-t)))) *
exp(-par2/par3*(1-exp(-par3*(top-x))))
return(value)
}
values<- rep(0,length(s))
for(i in 1:length(values)) {
values[i] <- integrate(Vectorize(integrand, vectorize.args='x'), lower=tail(tt,1), upper=s [i], top=s[i], params=c(parr1, parr2, parr3), data=tt, seed.time=s[i])
}
return(values)
}