使用copula分布的和的分位数太慢

时间:2011-11-11 22:15:30

标签: performance wolfram-mathematica mathematica-8

尝试使用具有Beta边缘的内置copula分布(Clayton,Frank,Gumbel)创建两个相关随机变量之和的分位数表。使用各种方法尝试了NProbabilityFindRoot - 速度不够快。 我需要探索的copula-marginal组合的一个例子如下:

nProbClayton[t_?NumericQ, c_?NumericQ] := 
        NProbability[  x + y <= t, {x, y}  \[Distributed]    
               CopulaDistribution[{"Clayton", c}, {BetaDistribution[8, 2], 
                                                   BetaDistribution[8, 2]}]]

使用

对数字概率进行单一评估
nProbClayton[1.9, 1/10] // Timing // Quiet

我得到了

{4.914, 0.939718}

在Vista 64bit Core2 Duo T9600 2.80GHz计算机(MMA 8.0.4)上

使用

获得总和的分位数
FindRoot[nProbClayton[q, 1/10] == 1/100, {q, 1, 0, 2}// Timing // Quiet

用各种方法

( `Method -> Automatic`, `Method -> "Brent"`, `Method -> "Secant"` ) 

需要大约一分钟才能找到一个分位数:时间是

{48.781, {q -> 0.918646}}
{50.045, {q -> 0.918646}}
{65.396, {q -> 0.918646}}

对于其他copula-marginal组合,时间稍微好一些。

需要:改善时间的任何技巧/方法。

1 个答案:

答案 0 :(得分:7)

具有参数c的Clayton-Pareto copula的CDF可以根据

计算
cdf[c_] := Module[{c1 = CDF[BetaDistribution[8, 2]]}, 
   (c1[#1]^(-1/c) + c1[#2]^(-1/c) - 1)^(-c) &]

然后,cdf[c][t1,t2]x<=t1y<=t2的概率。这意味着您可以根据

计算x+y<=t的概率
prob[t_?NumericQ, c_?NumericQ] := 
   NIntegrate[Derivative[1, 0][cdf[c]][x, t - x], {x, 0, t}]

我在机器上的时间是

prob[1.9, .1] // Timing

(* ==> {0.087518, 0.939825} *)

请注意,我从原始帖子中获得的概率值不同。但是,运行nProbClayton[1.9,0.1]会产生关于收敛缓慢的警告,这可能意味着原始帖子中的结果已关闭。另外,如果我在x+y<=t的原始定义中将x+y>t更改为nProbClayton并计算1-nProbClayton[1.9,0.1],我会得到0.939825(没有警告),这与以上。

对于我得到的和的分位数

FindRoot[prob[q, .1] == .01, {q, 1, 0, 2}] // Timing

(* ==> {1.19123, {q -> 0.912486}} *)

同样,我得到的结果与原帖中的结果不同,但与之前类似,将x+y<=t更改为x+y>t,计算FindRoot[nProbClayton[q, 1/10] == 1-1/100, {q, 1, 0, 2}]会返回{{1}的相同值如上所述。