我正在尝试使用梯形积分,因此使用下面的代码对对数正态分布的混合函数的生存函数(1-F(x))进行积分:
for(i in 1: nrow(mydf)){
mydf$Ex[i]<- trapzfun(function(x){(1-pnorm((log(x)-mydf$mu1[i])/mydf$sd1[i]))*mydf$pmix1[i]+(1-pnorm((log(x)-mydf$mu2[i])/mydf$sd2[i]))*mydf$pmix2[i]},a=0,b=1)
mu1
,sd1
,pmix1
是我的平均数,以对数刻度表示。 pmix1
和pmix2
是混合比例。
虽然运行良好,但大约需要3-5个小时的运行时间。 我猜“ for循环”不是一个好方法,我对R来说还很陌生。我确实尝试过使用apply函数:
mixture<- function(x){
trapzfun(function(x){(1-plnorm(x,mydf$mu1,mydf$sd1))*mydf$pmix1+(1-plnorm(x,mydf$mu2,mydf$sd2))*mydf$pmix2},a=0,b=1)
}
[请注意与plnorm和使用我应用的变换的pnorm相似]
mydf$Ex_1<- apply(mydf,1,mixture)
它正在返回list(value = c(0.055257000747731, 0.055257000747731, 0.00.....
您能帮我解决这个问题吗!