Changeset 00a4751 in tol


Ignore:
Timestamp:
Mar 13, 2012, 7:26:46 PM (15 years ago)
Author:
Víctor de Buen <vdebuen@…>
Branches:
1941-docker-image-to-test, devel, master
Children:
15ca3f3
Parents:
7cf1759
Message:

Refs #1136

git-svn-id: ​https://www.tol-project.org/svn/tolp/trunk@4348 be4846ae-f051-483a-831f-b64e7d08527f

Location:
tol
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • tol/bmath/bstat/arma.cpp

    r7cf1759 r00a4751  
    613613               "La estructura ARMA no es estacionaria."));
    614614      return(false);
    615     }
     615    } /*
    616616    else if(closeToNonStationary)
    617617    {
    … …  
    623623                 "  ar="+ar.Name()+"\n"
    624624                 "  ma="+ma.Name());
    625     }
     625    } */
    626626    for(k=0; (k<=p)&&(k<n0); k++)
    627627    {
    … …  
    14041404    BDat aCovDetNSqrt = Sqrt(aCovDetN_);
    14051405    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    }
    14071415    logLikelihood_ = -0.5*(N*Log(2.0*BDat::Pi()*s2)+N*Log(aCovDetN_)+wtCoviw_/s2);
    14081416    if(logLikelihood_.IsUnknown()) { logLikelihood_ = BDat::NegInf(); }
    … …  
    14611469    wtCoviw_ = ata_ ;
    14621470    aCovDetN_ = 0;
     1471    if(s2.IsUnknown()) { s2 = ata_/m; }
    14631472    logLikelihood_ = -0.5*( m*Log(2*BDat::Pi()*s2)+wtCoviw_/s2);
    14641473    return(true);
    … …  
    15551564  wtCoviw_ = ata_ + vtv;
    15561565  aCovDetN_ = Exp(log_det_cov_z/m);
     1566  if(s2.IsUnknown()) { s2 = ata_/m; }
    15571567  logLikelihood_ = -0.5*( m*Log(2*BDat::Pi()*s2)+log_det_cov_z+wtCoviw_/s2);
    15581568
  • tol/btol/bmodel/estim.cpp

    r7cf1759 r00a4751  
    3838#include <tol/tol_btxtgra.h>
    3939#include <tol/tol_bdtegra.h>
     40
     41#include <tol/tol_blas.h>
     42#include <tol/tol_lapack.h>
     43
    4044//#include <contrib/fftw/bfft.h>
    4145
    … …  
    13341338  BInt  n  = (BInt)Real(Arg(3));
    13351339  contens_ = ARMAACovGamma(ar,ma,n);
     1340}
     1341
     1342static 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//--------------------------------------------------------------------
     1353static 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//--------------------------------------------------------------------
     1360static 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//--------------------------------------------------------------------
     1367static 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//--------------------------------------------------------------------
     1409DeclareContensClass(BMat, BMatTemporary, BMatARMAACFBartlettCov);
     1410DefExtOpr(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//--------------------------------------------------------------------
     1423void 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//--------------------------------------------------------------------
     1434DeclareContensClass(BDat, BDatTemporary, BDatARMAACFBartlettLLH);
     1435DefExtOpr(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//--------------------------------------------------------------------
     1445void 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;
    13361479}
    13371480
    … …  
    17891932    if((var(0,j)<0) && !numErr)
    17901933    {
     1934      var(0,j) = BDat::PosInf();
     1935/*
    17911936      Error(I2("Numerical error in ARMAGohbergSemenculEval: "
    17921937               "MaxLHVar aproximation is out of range and take negative values.",
    17931938               "Error de tipo numérico en ARMAGohbergSemenculEval: "
    17941939               "la aproximación de MaxLHVar está fuera de rango y da valores negativos."));
     1940*/
    17951941      numErr = true;
    17961942    } 
    … …  
    17991945  BUserMat* Var = BContensMat::New("MaxLHVar",var, I2("Tra(W)*Inv(Cov)*W : Maximum likelihood estimated varianze of the model",
    18001946                                          "Tra(W)*Inv(Cov)*W : Estimación máximo verosímil de la varianza del modelo"));
    1801 
    18021947  BList* result=NIL;
    18031948  BList* aux=NIL;
Note: See TracChangeset for help on using the changeset viewer.