集成R函数错误

时间:2014-02-08 16:45:30

标签: r

我有以下R代码:

第一部分正在运作:

denSim <- function(n,nrow,ncol,v,ar) {
XX <- matrix(NA,nrow=nrow,ncol=ncol)
h1 <- h2 <- kknum <- kksum <- abc <- NULL

for(i in 1:n){
XX[,i] <- arima.sim(list(order=v,ar=ar), n=nrow)
h1[i]<-length(XX[,i])^(-1/5)
h2[i]<-sd(XX[,i])*h1[i]
kknum[[i]] <- exp(-0.5*((XX[nrow,i]-XX[,i])/bw.nrd0(XX[,i]))^2)
kksum[i]<-sum(kknum[[i]][-nrow])
abc[i]<- 1/(h2[i]*sqrt(2*pi))
}
Simls <- list(XX = XX,h1 = h1,h2=h2,kknum = kknum,kksum = kksum,abc = abc)
return(Simls)
}

Sim <- denSim(n=200,nrow=500,ncol=200,v=c(1,0,0),ar=0.6)

第二部分不起作用:

pdf <- function(z,i){
ABC <-Sim$abc[i]
Z <- z - Sim$XX[-1,i]
H2 <- Sim$h2[i]
eta <- ((Z)/H2)^2
KKN <- Sim$kknum[[i]][-500]
KKS <- Sim$kksum[i]
return(ABC*sum(KKN*exp(-0.5*eta))/KKS)
}
cdf <- function(i) integrate(pdf,0.6*mean(Sim$XX[,i]),20,i)$value
cdf(1)

问题是什么?

1 个答案:

答案 0 :(得分:2)

integrate(...)采用“矢量化函数”,例如将vector作为参数并返回相同长度的向量的函数。您的函数pdf(...)采用x的标量值并返回标量。

幸运的是有一个简单的解决方案,R中的Vectorize(...)函数是一个包装器,它将标量函数转换为向量函数。

pdf.vect <- Vectorize(pdf)
cdf <- function(i) integrate(pdf.vect,0.6*mean(Sim$XX[,i]),20,i)$value
cdf(1)
# [1] 0.6820746

编辑(对OP评论的回应)

是的,但integrate(...)也没有矢量化,所以你也必须这样做。

cdf <- Vectorize(function(x,i) integrate(pdf.vect,0.6*mean(Sim$XX[,i]),x,i)$value)

x <- seq(0,5,0.1)
plot(x,pdf.vect(x,1),type="l", ylab="Y")
par(new=T)
plot(x,cdf(x,1),yaxt="n", xaxt="n", col="red",type="l",ylab="",)