我正在尝试将t
copula与MatLab中的数据相匹配,我的功能是:
u = ksdensity(range_1, range_1,'function','cdf');
v = ksdensity(range_2, range_2,'function','cdf');
%fit a t-copula to returns
rng default ; % For reproducibility
[Rho,nu] = copulafit('t',[u v],'Method','ApproximateML');
我有个错误说:
使用chol错误 矩阵必须是正定的。 copulafit/approxProfileNLL_t中的错误(第314行) nll = negloglike_t(nu,chol(Rho),t_); copulafit>bracket1D中的错误(第494行) nllFun(束缚); copulafit中的错误(第126行) lowerBnd,upperBnd = bracket1D(profileFun,lowerBnd,5);%‘from’,从5向上搜索
我知道这是由于chol()
分解而发生的,但我不知道应该更改哪些参数来解决这个问题。任何帮助都将不胜感激。
我使用的数据如下:
range_1 range_2
-0.639388612 -0.639388612
1.029603565 1.029603565
1.273883288 1.273883288
0.754717135 0.754717135
1.747817835 1.747817835
1.717787291 1.717787291
-0.120625114 -0.120625114
2.173913469 2.173913469
2.836879977 2.836879977
-0.804601995 -0.804601995
0 0
发布于 2017-11-30 20:41:03
实际上,您的range1
和range2
变量是完全相同的。命令窗口中的简单检查确认了这一点:
eq = (range1 == range2)
eq =
11×1 logical array
1
1
1
1
1
1
1
1
1
1
1
由于copulafit
函数的目标是计算高斯Copula的线性相关参数矩阵的估计,所以整个过程失败,因为输入变量过于相关:
c = corr(range1,range2); % 1
事实上,我们正面临着range1
和range2
之间完美的正相关。抛出异常的函数chol
(reference 这里)只是产生高斯Copula拟合的过程的一部分,它由copulafit
函数在内部调用。
你唯一的解决办法是:
让我们使用第二个选项来做一个例子:
range1 = [
-0.639388612
1.029603565
1.273883288
0.754717135
1.747817835
1.717787291
-0.120625114
2.173913469
2.836879977
-0.804601995
0
];
% just an example, I'm tired of using rand function xD
range2 = awgn(range1,1,'measured');
u = ksdensity(range1, range1,'function','cdf');
v = ksdensity(range2, range2,'function','cdf');
rng default ;
[Rho,nu] = copulafit('t',[u v],'Method','ApproximateML');
这样做是没有错误的。
https://stackoverflow.com/questions/46132290
复制相似问题