R中的积分:找到捕捉

R中的积分:找到捕捉,r,function,integral,R,Function,Integral,好吧,这让我难堪了三天多,在离解决方案还差一步之后,我要在这里碰碰运气 在过去,我为一个特定的排序数据集编写了一些代码,如下所示: 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} els

好吧,这让我难堪了三天多,在离解决方案还差一步之后,我要在这里碰碰运气

在过去,我为一个特定的排序数据集编写了一些代码,如下所示:

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)
}
但是,现在我尝试对每个已排序的数据集进行概括,所以我所做的是(要明确的是:在执行所有这些函数之前,数据集x已排序)

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

任何帮助都将不胜感激

编辑: 在仔细查看矢量化函数和集成函数后,我现在将我的增量函数编辑为:

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)
}

delta这里的主要问题是
integrate
希望您将要积分的变量作为第一个参数。在第一组代码中,您正在对
m
进行积分。在第二组中,您试图通过
x
进行积分

最短的编辑是生成一个helper函数,以将参数按必要的顺序放置在
集成中

delta<- function(x,h,maxu= max(x)){
  minobs <- min(x)
  g <- function(m) f(x,m,h)
  return( integrate(Vectorize(g), minobs, maxu)$value )
}
我相信您第二个错误的来源是由于尝试在
h
上进行矢量化,而您实际上只想在
m
上进行矢量化。上面的helper函数方法也消除了这个问题,它只公开了您希望集成的变量

请注意,我无法说出您在这里真正想要做什么,但我还将提供此重写,它应该与您的实现等效,但可能更容易遵循:

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 )
}
FG
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)
}
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 )
}