【发布时间】: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 应该可以防止此类错误?
【问题讨论】: