尝试使用具有Beta边际的内置copula分布(Clayton,Frank,Gumbel)创建两个因变量的和的分位数表。用各种方法尝试了NProbability
和FindRoot
-不够快。
我需要研究的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 64位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组合,时机稍好一些。
需要:任何改善时间安排的技巧/方法。
最佳答案
可以根据以下公式计算参数为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<=t1
和y<=t2
的概率。这意味着您可以根据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} *)
请注意,我获得的概率值与原始帖子中的概率值不同。但是,运行
x+y<=t
会产生有关收敛缓慢的警告,这可能意味着原始帖子中的结果已关闭。另外,如果我在nProbClayton[1.9,0.1]
的原始定义中将x+y<=t
更改为x+y>t
并计算nProbClayton
,我会得到1-nProbClayton[1.9,0.1]
(无警告),其结果与上述相同。对于总和的分位数,我得到
FindRoot[prob[q, .1] == .01, {q, 1, 0, 2}] // Timing
(* ==> {1.19123, {q -> 0.912486}} *)
同样,我得到的结果与原始帖子中的结果不同,但与之前类似,将
0.939825
更改为x+y<=t
并计算x+y>t
将为FindRoot[nProbClayton[q, 1/10] == 1-1/100, {q, 1, 0, 2}]
返回与上述相同的值。