更新2.0:现在提供的数据应该可以重现错误:
不同功能的数据:
z <- seq(0,2,length=1000)
t <- grid <- c(0.1,0.55,0.9)
parA <- c(0.21,-0.93)
parB <- c(0.21,1.008)
p <- c(1,2,1,2)
## for plotting ##
f_func <- function(x) exp(-x^3+x)
envARS1 <- function(x){ exp(parA[1]*x+parB[1])}
envARS2 <- function(x){ exp(parA[2]*x+parB[2])}
plot(x=z,y=envARS1(z), type = "l", col = "blue", ylim = c(0,2), xlim = c(0,2))
lines(x=z,y=envARS2(z), type = "l", col = "red")
lines(x = z,(f_func(z)), type = "l", col = "black")
我正在尝试使用无衍生方法实现自适应拒绝采样器。在这个实现的过程中,我必须实现一个动态包络函数,它可以根据某些Zt的值/数量进行调整。
我已经完成了写一个动态包络功能,它似乎工作得很好但是当我尝试整合信封时,最终的目的是从这个信封中抽取,我得到了错误。
DynamicEnv <- function(x){
exp(parA[p[max(which(x>=grid))]]*x+
parB[p[max(which(x>=grid))]])
}
包络函数是指数线性线,参数a和b取决于x(它的输入)相对于Zt的位置。 变量'grid'包含Zt,因此是一个向量,p是一个动态位置变量,它实际上告诉函数使用哪些参数。
所以我遇到的第一个问题是,当我给动态信封一个向量作为输入时,我遇到了'which'函数的问题,根据我的理解,它只能处理数值。
更新了我从'which'
收到的错误我得到以下错误:
Error in which(x > grid) :
dims [product 3] do not match the length of object [1000]
我认为这是因为'哪个'试图将两个矢量相互比较,而不是x中的第n个元素与整个网格矢量。
然后我尝试合并一个循环,遍历x向量中的所有值,并返回带有输出值的向量,但是当我尝试时,我得到错误消息“非有限函数值”整合我的动态信封。
内部有一个循环的动态包络是
DynamicEnv1 <- function(x){
Draws <- matrix(0,length(x),1)
for (i in 1:length(x)) Draws[i,1] <-
exp(parA[p[max(which(x[i]>=grid))]]*x[i] + parB[p[max(which(x[i]>=grid))]])
return(Draws)
}
我已经编写了这个'静态'包络函数,它可以从中进行绘制(从而集成)。
envARSup <- function(x){ (ifelse((x <= t[1] | t[2] < x & x <= t[3]),
exp(parA[1]*x+parB[1]),exp(parA[2]*x+parB[2])))*1*(x>0)}
这里的t是上面提到的Zt。动态包络的概念应该从这个函数中清楚,因为理想情况下它们应该能够为同一个网格返回相同的值(Zt's / t)。 上述函数检查x的值属于哪个区间,并根据它使用特定指数线性线的区间。
我真的很感激,如果有人可以建议替代'which'函数,以便在向量中找到位置或帮助我理解为什么我会得到基于循环的动态包络的错误消息。