在R中集成/积分:找到捕获量

que*_*rty 5 r function integral

好吧,所以这让我难以忍受超过3天,在离解决方案还有一步之后,我会在这里试试运气.

在过去,我已经为特定的一个已排序数据集编写了一些代码,它是这样的:

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)
}
Run Code Online (Sandbox Code Playgroud)

它完美地工作.例如,如果选择数据:= c(1,2,3,4,5),则获得正确的结果

> delta(0.1, maxobs)
[1] 0.6300001
Run Code Online (Sandbox Code Playgroud)

但是,现在我正在尝试为每个已排序的数据集推广它,所以我做的是(要清楚:数据集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)
}
Run Code Online (Sandbox Code Playgroud)

但现在,delta(data,0.1)

delta(data,0.1)
[1] 0.
Run Code Online (Sandbox Code Playgroud)

这对我没有任何意义.相同的功能,相同的数据集,但现在具有错误的值.我究竟做错了什么?

任何帮助将非常感激.

编辑: 仔细看看Vectorize函数和集成函数后,我现在编辑了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)
}
Run Code Online (Sandbox Code Playgroud)

但现在这只会导致另一个错误:

集成错误(Vectorize(f,vectorize.args = c("m","h")),lower = minobs,:函数评估给出错误长度的结果

我认为Vectorize应该防止这样的错误?

A. *_*ebb 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 )
}
Run Code Online (Sandbox Code Playgroud)

现在,您将获得理想的结果

delta(data,0.1)
# [1] 0.6300001
Run Code Online (Sandbox Code Playgroud)

我相信你的第二个错误的来源是由于尝试向量化h,而你真的只想向量化m.上面的辅助函数方法通过仅暴露您希望集成的变量来消除此问题.

请注意,我不知道你在这里想要做什么,但我也会提供这个重写应该等同于你的实现,但也许更容易理解:

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 )
}
Run Code Online (Sandbox Code Playgroud)