gpt4 book ai didi

r - R : Find the catch 中的积分/积分

转载 作者:行者123 更新时间:2023-12-04 04:32:24 26 4
gpt4 key购买 nike

好的,所以这让我难住了超过 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)
}

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

Error in integrate(Vectorize(f, vectorize.args = c("m", "h")), lower = minobs, : evaluation of function gave a result of wrong length



我认为 Vectorize 应该可以防止此类错误?

最佳答案

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

关于r - R : Find the catch 中的积分/积分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36203314/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com