【发布时间】:2015-07-14 09:30:45
【问题描述】:
在回复a question on Cross Validated 时,我写了a simple function,它使用任意分位数函数作为其参数
etacor=function(rho=0,nsim=1e4,fx=qnorm,fy=qnorm){
#generate a bivariate correlated normal sample
x1=rnorm(nsim);x2=rnorm(nsim)
if (length(rho)==1){
y=pnorm(cbind(x1,rho*x1+sqrt((1-rho^2))*x2))
return(cor(fx(y[,1]),fy(y[,2])))
}
coeur=rho
rho2=sqrt(1-rho^2)
for (t in 1:length(rho)){
y=pnorm(cbind(x1,rho[t]*x1+rho2[t]*x2))
coeur[t]=cor(fx(y[,1]),fy(y[,2]))}
return(coeur)
}
但是,fx 和 fy 都可能需要它们自己的参数。例如,当fx=qchisq 或fy=qgamma 时。作为默认解决方案,在我的实现中,我使用了
fx=function(x) qchisq(x,df=3)
和
fy=function(x) qgamma(x,scale=.2)
但这很耗时。
例如,
> rhos=seq(-1,1,.01)
> system.time(trancor<-etacor(rho=rhos,fx=qlnorm,fy=qexp))
utilisateur système écoulé
0.834 0.001 0.834
对
> system.time(trancor<-etacor(rho=rhos,fx=qlnorm,fy=function(x) qchisq(x,df=3)))
utilisateur système écoulé
8.673 0.006 8.675
【问题讨论】:
-
我自己不会编写复杂的函数,但我认为您正在寻找
...语法:cran.r-project.org/doc/manuals/r-release/… -
我认为没有什么可以阻止您 (1) 在您的
...中为etacor包含df.x和df.y,(2) 解析...以获取这些和(3) 将解析出的值(如果找到)传递给fx和fy。这很复杂,但这不应该太令人惊讶。 -
没有什么能阻止你再拥有两个参数,每个参数都有
fx和fy的参数列表,然后在函数中通过do.call调用它们并构造一个列表论据。 -
关于您的编辑......不知道为什么您认为评估
qexp将花费与评估qchisq相同的时间。 -
进一步@joran 的观点。看看
x<-runif(1000); microbenchmark::microbenchmark(qexp(x),(function(x){qexp(x)})(x), qchisq(x, 3), (function(x){qchisq(x, 3)})(x))。让事情变慢的不是function()部分,而是您使用的是更复杂的分布。
标签: r function arguments simulation quantile