2017-09-09 5 views
3

Je suis en train de s'adapter t copule dans MatLab à mes données et ma fonction est:MatLab: Chol matrice doit être définie positive

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'); 

Et je reçois une erreur qui dit:

erreur en utilisant chol
La matrice doit être définie positive.
Erreur dans copulafit/approxProfileNLL_t (ligne 314)
nll = negloglike_t (nu, chol (Rho), t_);
Erreur dans copulafit> bracket1D (ligne 494)
oldnll = nllFun (lié);
Erreur dans copulafit (ligne 126)
[lowerBnd, upperBnd] = bracket1D (profileFun, lowerBnd, 5); % « Supérieure », recherche de croissant 5

Je compris que cela se produit en raison de la décomposition chol(), mais je ne sais pas quels paramètres doivent être modifiés pour résoudre ce problème. Toute aide serait appréciée.

données que j'utilise a été ressemble à:

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 

Répondre

0

En fait, vos range1 et range2 les variables sont absolument identiques. Une simple vérification dans la fenêtre de commande confirme:

eq = (range1 == range2) 

eq = 

    11×1 logical array 

    1 
    1 
    1 
    1 
    1 
    1 
    1 
    1 
    1 
    1 
    1 

Puisque le but de la fonction copulafit consiste à calculer l'estimation de la matrice de paramètres de corrélation linéaire pour une copule gaussienne, l'ensemble du processus échoue il les variables d'entrée sont trop corrélation:

c = corr(range1,range1); % 1 

en fait, nous sommes confrontés à une corrélation positive parfaite entre range1 et range2. La fonction qui lève l'exception, chol (référence here), est juste une partie du processus produisant un ajustement Copula gaussien et il est appelé en interne par la fonction copulafit.

Les seules solutions que vous avez sont:

  1. changeant vos variables
  2. ajoutant un bruit aléatoire à vos variables (si vous êtes autorisé à)

Faisons un exemple en utilisant la seconde option:

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'); 

Cela fonctionnera sans erreur.