2014-02-08 34 views
0

我有下列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

它不工作怎么办?你有错误吗?或者是你期望没有发生的事情? – bnjmn

回答

2

integrate(...)采用“矢量化函数”,例如,一个将矢量作为参数并返回相同长度的矢量的函数。你的函数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="",) 

+0

非常感谢,我可以将20改为x,所以我可以得到cdf函数,如果不是,有没有办法可以计算cdf不使用积分? –

+0

@frespider - 查看我的编辑。 – jlhoward