在R中的积分/综合:找到问题关键

5

好的,这个问题困扰了我三天以上,但即使到现在仍然没有更接近解决方案的一步,因此我想在这里试试运气。

过去,我曾针对一个特定的排序数据集编写过一些代码,它是这样的:

n <- length(data)
maxobs <- max(data)
minobs <- min(data)
FG <- function(m=NULL, h = NULL){
    n<- length(data) #Number of observations
    if (m<minobs){FG = 0} else { 
        if (m >maxobs){FG = 1} else {
                    FG = sum(pnorm((m - data)/h)-pnorm((minobs-data)/h))/sum(pnorm((maxobs - data)/h)-pnorm((minobs-data)/h))   
    }}
    return(FG)
}

f<- function(m,h){
    f<- FG(m,h)^n
    return(f)
}

##Integration
max <- NULL
delta<- function(h,max=maxobs){
    delta <- integrate(Vectorize(f), minobs, max, h)$value
    return (delta)
}

这个功能完美运行。例如,如果选择数据:= c(1,2,3,4,5),则可以获得正确的结果。
> delta(0.1, maxobs)
[1] 0.6300001

然而,现在我正在试图将其推广到每个已排序的数据集,所以我所做的是(为了清楚起见:数据集x在执行所有这些函数之前已经排序)

FG <- function(x, m=NULL, h = NULL){
  n<- length(x) #Number of observations
  maxobs <- max(x)
  minobs <- min(x)
  if (m<minobs){FG = 0} else { 
    if (m >maxobs){FG = 1} else {
      FG = sum(pnorm((m - x)/h)-pnorm((minobs-x)/h))/sum(pnorm((maxobs - x)/h)-pnorm((minobs-x)/h)) 
    }}
  return(FG)
}

f<- function(x,m,h){
  n <- length(x)
  f<- FG(x,m,h)^n
  return(f)
}

##Integration
delta<- function(x,h,maxu= max(x)){
minobs <- min(x)
  delta <- integrate(Vectorize(f), minobs, maxu, h)$value
  return (delta)
}

但现在,delta(data,0.1)的输出结果为:
delta(data,0.1)
[1] 0.

这对我来说毫无意义。同样的函数、相同的数据集,但现在却出现了错误的值。我做错了什么?

非常感谢您提供任何帮助。

编辑:在更仔细地查看Vectorize函数和Integrate函数后,我现在已经编辑了我的Delta函数:

delta<- function(x,h,maxu= max(x)){
minobs <- min(x)
  delta <- integrate(Vectorize(f, vectorize.args= c("m","h")), minobs, maxu, h)$value
  return (delta)
}

但是现在出现了另一个错误:

在将(Vectorize(f, vectorize.args = c("m", "h")),lower = minobs)整合时出错:函数的评估结果长度错误

我以为Vectorize应该可以防止这样的错误发生?
1个回答

6
这里的主要问题是`integrate`函数希望你把被积变量放在第一参数上。在第一段代码中,你正在对`m`进行积分。在第二组代码中,你试图对`x`进行积分。
最简单的修改方法是创建一个支持函数,以便为`integrate`函数放置必要的参数顺序。
delta<- function(x,h,maxu= max(x)){
  minobs <- min(x)
  g <- function(m) f(x,m,h)
  return( integrate(Vectorize(g), minobs, maxu)$value )
}

现在你将获得你想要的结果

delta(data,0.1)
# [1] 0.6300001

我认为你第二个错误的源头是试图在上进行向量化,而你实际上只想在上进行向量化。上述的助手函数方法也通过仅暴露您希望集成的变量来消除了此问题。
请注意,我无法确定您真正想在这里做什么,但我还将提供以下重写,它应该等同于您的实现,但可能更容易理解:
FG <- function(m, x, h) {
  n <- length(x)
  d <- function(t) pnorm((t-x)/h)

  if(m < x[1]) return(0)
  if(m > x[n]) return(1)

  return( sum(d(m)-d(x[1]))/sum(d(x[n])-d(x[1])) )
}

f<- function(m, x, h){
  n <- length(x)
  mapply(function(m) FG(m,x,h)^n, m)
}

delta<- function(x, h, lb=x[1], ub=x[length(x)]) {
  return( integrate(f, lb, ub, x, h)$value )
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接