首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R中的积分/积分:找到捕获

R中的积分/积分:找到捕获
EN

Stack Overflow用户
提问于 2016-03-24 15:00:27
回答 1查看 250关注 0票数 5

好的,这让我困惑了超过3天,在离解决方案还没有一步之后,我要在这里试试我的运气。

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

代码语言:javascript
复制
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),将得到正确的结果

代码语言:javascript
复制
> delta(0.1, maxobs)
[1] 0.6300001

但是,现在我试图对每个已排序的数据集进行泛化,所以我所做的是(必须明确: dataset x是在执行所有这些功能之前排序的)。

代码语言:javascript
复制
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)给了

代码语言:javascript
复制
delta(data,0.1)
[1] 0.

对我来说没有任何意义。相同的函数,相同的数据集,但现在有错误的值。我做错了什么?

任何帮助都将不胜感激。

编辑:在仔细查看了Vectorize函数和integrate之后,我现在编辑了自己的delta函数如下:

代码语言:javascript
复制
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)
}

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

积分误差(f,vectorize.args = c("m","h")),lower = minobs,:函数的求值给出了一个错误的结果

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-29 17:18:15

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

最短的编辑是创建一个帮助函数,将参数按integrate所需的顺序放置

代码语言:javascript
复制
delta<- function(x,h,maxu= max(x)){
  minobs <- min(x)
  g <- function(m) f(x,m,h)
  return( integrate(Vectorize(g), minobs, maxu)$value )
}

现在你会得到你想要的结果

代码语言:javascript
复制
delta(data,0.1)
# [1] 0.6300001

我认为您的第二个错误是由于试图在h上进行矢量化,而实际上您只想在m上进行矢量化。上面的助手函数方法也消除了这个问题,只公开了您希望集成的变量。

请注意,我不知道您在这里到底想做什么,但我也将提供与您的实现相同的重写,但可能更容易理解:

代码语言:javascript
复制
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 )
}
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36203314

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档