kgl*_*glr 6 performance wolfram-mathematica mathematica-8
尝试使用具有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]}]]
Run Code Online (Sandbox Code Playgroud)
对于使用的数值概率的单一评估
nProbClayton[1.9, 1/10] // Timing // Quiet
Run Code Online (Sandbox Code Playgroud)
我明白了
{4.914, 0.939718}
Run Code Online (Sandbox Code Playgroud)
在Vista 64bit Core2 Duo T9600 2.80GHz机器上(MMA 8.0.4)
要获得总和的分位数,请使用
FindRoot[nProbClayton[q, 1/10] == 1/100, {q, 1, 0, 2}// Timing // Quiet
Run Code Online (Sandbox Code Playgroud)
用各种方法
( `Method -> Automatic`, `Method -> "Brent"`, `Method -> "Secant"` )
Run Code Online (Sandbox Code Playgroud)
花大约一分钟才能找到一个分位数:时间是
{48.781, {q -> 0.918646}}
{50.045, {q -> 0.918646}}
{65.396, {q -> 0.918646}}
Run Code Online (Sandbox Code Playgroud)
对于其他copula-marginal组合,时间稍微好一些.
需要:改善时间的任何技巧/方法.
具有参数的Clayton-Pareto copula的CDF c可以根据计算
cdf[c_] := Module[{c1 = CDF[BetaDistribution[8, 2]]},
(c1[#1]^(-1/c) + c1[#2]^(-1/c) - 1)^(-c) &]
Run Code Online (Sandbox Code Playgroud)
于是,cdf[c][t1,t2]概率是x<=t1和y<=t2.这意味着,你可以计算出的概率x+y<=t,根据
prob[t_?NumericQ, c_?NumericQ] :=
NIntegrate[Derivative[1, 0][cdf[c]][x, t - x], {x, 0, t}]
Run Code Online (Sandbox Code Playgroud)
我在机器上的时间是
prob[1.9, .1] // Timing
(* ==> {0.087518, 0.939825} *)
Run Code Online (Sandbox Code Playgroud)
请注意,我从原始帖子中得到的概率值不同.但是,运行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}} *)
Run Code Online (Sandbox Code Playgroud)
同样,我得到的结果与原帖中的结果不同,但与之前类似,更改x+y<=t为x+y>t和计算FindRoot[nProbClayton[q, 1/10] == 1-1/100, {q, 1, 0, 2}]返回相同的值,q如上所述.
| 归档时间: |
|
| 查看次数: |
409 次 |
| 最近记录: |