使用Apply

时间:2019-06-30 09:49:38

标签: r

下面,我有一个名为 mysim.obs 的矩阵(548行和(1 + nsim)列,其第一列是我的观测值,接下来的列包括从拟合模型到第一行的模拟)柱)。我想在 mysim.obs 的每一列上评估 simpsonlognormpval 函数。为此,我使用了Apply函数。 不幸的是,运行Apply需要很长时间(我有几种模型,下面的对数正态模型仅用于说明)。 如何修改代码以使其运行更快。

非常感谢。

您, 哈米德

simpsonlognormpval <- function(xx){
# numerical integral using Simpson's rule
# assume a < b and n is an even positive integer
      n<-10000
a<-0;b<- 25*max(xx) #because log-normal distribution has heavy tail
meanlog = -0.216
sdlog = 1.4245521
h <- (b-a)/n
x <- seq(a, b, by=h)
            y <- (plnorm(x, meanlog = meanlog0 , sdlog =sdlog0 )-ecdf(xx)(x))^2
if (n == 2) {
    s <- (y[1] + 4*y[2] +y[3])
} else {
    s <- y[1] + y[n+1] + 2*sum(y[seq(2,n,by=2)]) + 4 *sum(y[seq(3,n-1, by=2)])
}
s <- s*h/3
return(s)
}

>meanlog0 = -0.216
>sdlog0 = 1.4245521
>nsim=100000
>my.obs<-rexp( 548,0.5*lambda ) #my.obs is acctually an observed sample, here I just replaced it
>mysim.obs<-cbind(my.obs ,matrix(rlnorm(548*nsim, meanlog = meanlog0, sdlog =sdlog0),548,nsim))

>fsimpsonlognormpval <-apply( mysim.obs, 2,simpsonlognormpval )
> fsimpsonlognormpval[1]
>lognormpval<-mean(fsimpsonlognormpval[2:(nsim+1)]>fsimpsonlognormpval[1])
>lognormpval

0 个答案:

没有答案