【问题标题】:Integrating/Integral in R: Find the catchR中的积分/积分:找到问题
【发布时间】:2016-07-12 05:28:29
【问题描述】:

好的,这让我困惑了超过 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)
}

效果很好。例如,如果选择 data := 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 函数和积分函数之后,我现在将我的 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 应该可以防止此类错误?

【问题讨论】:

    标签: r function integral


    【解决方案1】:

    这里的主要问题是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
    

    我相信您的第二个错误的根源是由于尝试对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 )
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-01
      • 2016-08-11
      • 2015-04-04
      • 2016-04-05
      • 2015-01-23
      • 2018-01-17
      • 2017-08-28
      相关资源
      最近更新 更多