Changeset 00a4751 in tol
- Timestamp:
- Mar 13, 2012, 7:26:46 PM (15 years ago)
- Branches:
- 1941-docker-image-to-test, devel, master
- Children:
- 15ca3f3
- Parents:
- 7cf1759
- Location:
- tol
- Files:
-
- 2 edited
-
bmath/bstat/arma.cpp (modified) (5 diffs)
-
btol/bmodel/estim.cpp (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
tol/bmath/bstat/arma.cpp
r7cf1759 r00a4751 613 613 "La estructura ARMA no es estacionaria.")); 614 614 return(false); 615 } 615 } /* 616 616 else if(closeToNonStationary) 617 617 { … … 623 623 " ar="+ar.Name()+"\n" 624 624 " ma="+ma.Name()); 625 } 625 } */ 626 626 for(k=0; (k<=p)&&(k<n0); k++) 627 627 { … … 1404 1404 BDat aCovDetNSqrt = Sqrt(aCovDetN_); 1405 1405 likelihoodCoef_ = aCovDetNSqrt*waCoef_; 1406 BDat s2 = sigma^2; 1406 BDat s2; 1407 if(sigma.IsUnknown()) 1408 { 1409 s2 = ata_/N; 1410 } 1411 else 1412 { 1413 s2 = sigma^2; 1414 } 1407 1415 logLikelihood_ = -0.5*(N*Log(2.0*BDat::Pi()*s2)+N*Log(aCovDetN_)+wtCoviw_/s2); 1408 1416 if(logLikelihood_.IsUnknown()) { logLikelihood_ = BDat::NegInf(); } … … 1461 1469 wtCoviw_ = ata_ ; 1462 1470 aCovDetN_ = 0; 1471 if(s2.IsUnknown()) { s2 = ata_/m; } 1463 1472 logLikelihood_ = -0.5*( m*Log(2*BDat::Pi()*s2)+wtCoviw_/s2); 1464 1473 return(true); … … 1555 1564 wtCoviw_ = ata_ + vtv; 1556 1565 aCovDetN_ = Exp(log_det_cov_z/m); 1566 if(s2.IsUnknown()) { s2 = ata_/m; } 1557 1567 logLikelihood_ = -0.5*( m*Log(2*BDat::Pi()*s2)+log_det_cov_z+wtCoviw_/s2); 1558 1568 -
tol/btol/bmodel/estim.cpp
r7cf1759 r00a4751 38 38 #include <tol/tol_btxtgra.h> 39 39 #include <tol/tol_bdtegra.h> 40 41 #include <tol/tol_blas.h> 42 #include <tol/tol_lapack.h> 43 40 44 //#include <contrib/fftw/bfft.h> 41 45 … … 1334 1338 BInt n = (BInt)Real(Arg(3)); 1335 1339 contens_ = ARMAACovGamma(ar,ma,n); 1340 } 1341 1342 static BDat _getACF(const BMat& rho, int k) 1343 { 1344 int s = rho.Data().Size(); 1345 if(k== 0) { return(1.0); } 1346 if(k>= s) { return(0.0); } 1347 if(k<=-s) { return(0.0); } 1348 if(k< 0) { return(rho.Data()[-k-1]); } 1349 /* if(k> 0)*/ return(rho.Data()[+k-1]); 1350 }; 1351 1352 //-------------------------------------------------------------------- 1353 static BDat _getACF_BartlettFactor(const BMat& rho, int k, int i) 1354 //-------------------------------------------------------------------- 1355 { 1356 return(_getACF(rho,k+i)+_getACF(rho,k-i)-2*_getACF(rho,i)+_getACF(rho,k)); 1357 }; 1358 1359 //-------------------------------------------------------------------- 1360 static BDat _getACF_Bartlett(const BMat& rho, int k, int i, int j) 1361 //-------------------------------------------------------------------- 1362 { 1363 return(_getACF_BartlettFactor(rho,k,i)*_getACF_BartlettFactor(rho,k,j)); 1364 }; 1365 1366 //-------------------------------------------------------------------- 1367 static void _covACF_Bartlett(BMat& cov, const BMat& rho, int n, int T, int s_) 1368 //-------------------------------------------------------------------- 1369 { 1370 cov.Alloc(n,n); 1371 int i,j,k,s; 1372 BArray<BDat> bf(n); 1373 for(s=s_; s>10; s--) 1374 { 1375 if(Abs(rho.Data()(s-1))>1.E-6) { break; } 1376 } 1377 for(i=0; i<n; i++) 1378 { 1379 for(j=0; j<=i; j++) 1380 { 1381 cov(i,j)=0; 1382 } 1383 } 1384 for(k=1; k<=s; k++) 1385 { 1386 for(i=0; i<n; i++) 1387 { 1388 bf(i) = _getACF_BartlettFactor(rho,k,i+1); 1389 } 1390 for(i=0; i<n; i++) 1391 { 1392 for(j=0; j<=i; j++) 1393 { 1394 cov(i,j) += bf(i)*bf(j); 1395 } 1396 } 1397 } 1398 for(i=0; i<n; i++) 1399 { 1400 for(j=0; j<=i; j++) 1401 { 1402 cov(i,j) /= T; 1403 if(i>j) { cov(j,i) = cov(i,j); } 1404 } 1405 } 1406 } 1407 1408 //-------------------------------------------------------------------- 1409 DeclareContensClass(BMat, BMatTemporary, BMatARMAACFBartlettCov); 1410 DefExtOpr(1, BMatARMAACFBartlettCov, "ARMA.ACF.Bartlett.Cov", 3, 3, 1411 "Matrix Real Real", 1412 "(Matrix rho, Real n, Real T)", 1413 I2("Calculates the covariance of asymptotic distribution of sample " 1414 "autocorrelation of orders from 1 to n of an ARMA noise of size T, " 1415 "given the theorical ACF rho, that should be calculated until it " 1416 "decays to zero.", 1417 "Calcula la matriz de covarianzas de la distribución aintótica " 1418 "de las autocorrelaciones muestrales de órdenes 1 a n de un ruido " 1419 "ARMA de tamañlo T, dada la ACF teórica rho, la cual debería ser " 1420 "calculada hasta que decaiga a cero."), 1421 BOperClassify::Sthocastic_); 1422 //-------------------------------------------------------------------- 1423 void BMatARMAACFBartlettCov::CalcContens() 1424 //-------------------------------------------------------------------- 1425 { 1426 BMat& rho = Mat(Arg(1)); 1427 int n = (int)Real(Arg(2)); 1428 int T = (int)Real(Arg(3)); 1429 int s = rho.Data().Size(); 1430 _covACF_Bartlett(contens_,rho,n,T,s); 1431 } 1432 1433 //-------------------------------------------------------------------- 1434 DeclareContensClass(BDat, BDatTemporary, BDatARMAACFBartlettLLH); 1435 DefExtOpr(1, BDatARMAACFBartlettLLH, "ARMA.ACF.Bartlett.LLH", 4, 4, 1436 "Polyn Polyn Matrix Real", 1437 "(Polyn ar, Polyn ma, Matrix acf, Real T)", 1438 I2("Calculates the log-likelihood of asymptotic distribution of sample " 1439 "autocorrelation of orders from 1 to n of an ARMA noise of size T.", 1440 "Calcula la log-verosimilitud de la distribución aintótica " 1441 "de las autocorrelaciones muestrales de órdenes 1 a n de un ruido " 1442 "ARMA de tamañlo T"), 1443 BOperClassify::Sthocastic_); 1444 //-------------------------------------------------------------------- 1445 void BDatARMAACFBartlettLLH::CalcContens() 1446 //-------------------------------------------------------------------- 1447 { 1448 static double _05log2pi = 0.5*log(2*3.14159265358979323846); 1449 BPol& ar = Pol(Arg(1)); 1450 BPol& ma = Pol(Arg(2)); 1451 BMat& acf = Mat(Arg(3)); 1452 int T = (int)Real(Arg(4)); 1453 int n = acf.Data().Size(); 1454 int s = T*2; 1455 int res; 1456 BMat rho, rho_, dif, cov, L, eps; 1457 BDat alpha = 1.0; 1458 BArray<BDat> gn; 1459 int i; 1460 1461 ARMAAutoCovarianzeVector(gn,ar,ma,s+1,1); 1462 rho = BMatrix<BDat>(s,1,gn.Buffer()+1) / gn[0]; 1463 rho_ = BMatrix<BDat>(n,1,gn.Buffer()+1) / gn[0]; 1464 dif = acf-rho_; 1465 _covACF_Bartlett(cov,rho,n,T,s); 1466 1467 res = TolLapack::dpotrf(CblasLower,cov,L); 1468 res = TolBlas::dtrsm(CblasLeft,CblasLower,CblasNoTrans,CblasNonUnit,alpha, 1469 L,dif,eps); 1470 const BDat* eps_i = eps.Data().Buffer(); 1471 BDat eps_sumSqr = 0; 1472 BDat log_det = 0; 1473 for(i=0; i<n; i++, eps_i++) 1474 { 1475 log_det += Log(L(i,i)); 1476 eps_sumSqr += *eps_i * *eps_i; 1477 } 1478 contens_ = -n*_05log2pi-0.5*eps_sumSqr- 0.5*log_det; 1336 1479 } 1337 1480 … … 1789 1932 if((var(0,j)<0) && !numErr) 1790 1933 { 1934 var(0,j) = BDat::PosInf(); 1935 /* 1791 1936 Error(I2("Numerical error in ARMAGohbergSemenculEval: " 1792 1937 "MaxLHVar aproximation is out of range and take negative values.", 1793 1938 "Error de tipo numérico en ARMAGohbergSemenculEval: " 1794 1939 "la aproximación de MaxLHVar está fuera de rango y da valores negativos.")); 1940 */ 1795 1941 numErr = true; 1796 1942 } … … 1799 1945 BUserMat* Var = BContensMat::New("MaxLHVar",var, I2("Tra(W)*Inv(Cov)*W : Maximum likelihood estimated varianze of the model", 1800 1946 "Tra(W)*Inv(Cov)*W : Estimación máximo verosímil de la varianza del modelo")); 1801 1802 1947 BList* result=NIL; 1803 1948 BList* aux=NIL;
Note: See TracChangeset
for help on using the changeset viewer.
