Changeset a05bd10 in tol


Ignore:
Timestamp:
Nov 27, 2012, 6:20:43 PM (14 years ago)
Author:
Víctor de Buen <vdebuen@…>
Branches:
1941-docker-image-to-test, devel, master
Children:
bab7ea7
Parents:
42b635f
Message:

Preparing model diagnostics out of Estimate

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

File:
1 edited

Legend:

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

    r42b635f ra05bd10  
    3535#include <tol/tol_bsvdsep.h>
    3636#include <tol/tol_bratio.h>
     37#include <tol/tol_bprdist.h>
     38#include <tol/tol_barma.h>
    3739
    3840
    … …  
    13471349  }
    13481350}
     1351
     1352//--------------------------------------------------------------------
     1353static BDat AbsNormal(BDat x)
     1354//--------------------------------------------------------------------
     1355{
     1356  return(2*BNormalDist::Dist01(Abs(x)) - BDat(1));
     1357}
     1358
     1359//--------------------------------------------------------------------
     1360bool Diagnostic_ARIMA_ResAcf_NormalUnivariate(
     1361  BDat& statValue,
     1362  BDat& refuseProb,
     1363  const BArray<BDat>& acf,
     1364  int dataLength,
     1365  int lag)
     1366//--------------------------------------------------------------------
     1367{
     1368  if(acf.Size()<lag) { return(false); }
     1369  statValue = acf[lag];
     1370  refuseProb = AbsNormal(statValue*Sqrt(dataLength));
     1371  return(true);
     1372}
     1373
     1374//--------------------------------------------------------------------
     1375bool Diagnostic_ARIMA_ResAcf_BoxPierceLjung(
     1376  BDat& statValue,
     1377  BDat& refuseProb,
     1378  const BArray<BDat>& acf,
     1379  int dataLength,
     1380  int p,
     1381  int q)
     1382//--------------------------------------------------------------------
     1383{
     1384  if(acf.Size()<=p+q) { return(false); }
     1385  int m = acf.Size();
     1386  statValue = BoxPierceLjungACF(acf, m, dataLength);
     1387  BChiSquareDist Chi(m-p-q);
     1388  refuseProb = Chi.Dist(statValue);
     1389  return(true);
     1390}
     1391
     1392//--------------------------------------------------------------------
     1393bool Diagnostic_ARIMA_ResAcf_BoxPierceMod(
     1394  BDat& statValue,
     1395  BDat& refuseProb,
     1396  const BArray<BDat>& acf,
     1397  int dataLength,
     1398  int p,
     1399  int q)
     1400//--------------------------------------------------------------------
     1401{
     1402  if(acf.Size()<=p+q) { return(false); }
     1403  int m = acf.Size();
     1404  statValue = BoxPierceModACF(acf, m, dataLength);
     1405  BChiSquareDist Chi(m-p-q);
     1406  refuseProb = Chi.Dist(statValue);
     1407  return(true);
     1408}
     1409
     1410//--------------------------------------------------------------------
     1411bool Diagnostic_NormalReg_Res_Pearson(
     1412  BDat& statValue,
     1413  BDat& refuseProb,
     1414  const BArray<BDat>& res)
     1415//--------------------------------------------------------------------
     1416{
     1417  int N_ = res.Size();
     1418  if(N_<=100) { return(false); }
     1419  BInt         i,j;
     1420//Std(BText("\nTRACE PearsonNormalityTest "));
     1421  BNormalDist U(0,1);
     1422  //Cálculo de la desviación típica en base a cuantiles para filtrar outliers
     1423  BDat sQ = 0;
     1424  {
     1425    int nQ = (N_>30)?3:1;
     1426    BArray<BDat> q(nQ), p(nQ), Q(nQ);
     1427    if(nQ==1)
     1428    {
     1429      q[0]=1.0;
     1430    }
     1431    else
     1432    {
     1433      q[0]=0.9;
     1434      q[1]=1.0;
     1435      q[2]=1.1;
     1436    }
     1437    for(i=0; i<nQ; i++) { p[i] = U.Dist(q[0]); }
     1438    BArray<BDat> A(N_);
     1439    for(i=0; i<N_; i++) { A[i] = Abs(res(i)); }
     1440    Quantile(A, p, Q);
     1441    for(i=0; i<nQ; i++)
     1442    {
     1443      sQ += Q[i]/(Abs(q[i])*Sqrt(2.0));
     1444    }
     1445    sQ /= nQ;
     1446  }
     1447
     1448  //Filtrado de outliers
     1449  BArray<BDat> Y(N_);
     1450  BDat kSig = -U.Inverse(1.0/N_,0);
     1451  for(i=j=0; i<N_; i++)
     1452  {
     1453    BDat x = res(i)/sQ;
     1454    if(Abs(x) <= kSig) { Y(j++) = x; }
     1455  }
     1456  int N = j;
     1457  Y.ReallocBuffer(N);
     1458
     1459  //Pearson goodness of fit test statistic
     1460  BInt nQ = (N>=900)?(int)sqrt((double)N):(N>=400)?30:(N>=100)?6:4;
     1461//Std(BText("TRACE BModel::PearsonNormalityTest nQ=")+nQ+" sQ="+sQ+"\n");
     1462  BChiSquareDist Chi(nQ-3);
     1463  BArray<BDat> q(nQ+1);
     1464  BDat chi=0;
     1465  BDat step = (((double)N_-2.0)/double(N_*nQ));
     1466  BDat p = 1.0/N_;
     1467  for(j=0; j<=nQ; j++, p+=step)
     1468  {
     1469    q[j] = U.Inverse(p,0);
     1470  }
     1471  p = 1.0/nQ;
     1472  for(j=1; j<=nQ; j++)
     1473  {
     1474    BDat q0 = q[j-1];
     1475    BDat q1 = q[j];
     1476    BDat Q = 0;
     1477    for(i=0; i<N; i++)
     1478    {
     1479      Q += And(q0 <= Y[i], Y[i] < q1);
     1480    }
     1481    Q/=N;
     1482    BDat dif = Q-p;
     1483    BDat dif2 = dif*dif;
     1484    BDat dif2p = dif2/p;
     1485  //Std(BText("TRACE BModel::PearsonNormalityTest   Q=")+Q+" p="+p+" dif="+dif+" dif2="+dif2+" dif2p="+dif2p+"\n");
     1486    chi += dif2p;
     1487  }
     1488  statValue = chi;
     1489  refuseProb = Chi.Dist(chi);
     1490  return(true);
     1491}
     1492
     1493//--------------------------------------------------------------------
     1494bool Diagnostic_NormalReg_ParamSignif(
     1495  BDat& statValue,
     1496  BDat& refuseProb,
     1497  const BArray<BDat>& mean,
     1498  const BArray<BDat>& stdErr,
     1499  int dataLength)
     1500//--------------------------------------------------------------------
     1501{
     1502  int numParam = mean.Size();
     1503  if(!numParam) { return(false); }
     1504
     1505  BTStudentDist T(dataLength-numParam);
     1506  BInt i;
     1507  statValue=BDat::PosInf();
     1508  for(i=0; i<numParam; i++)
     1509  {
     1510    BDat t = Abs(mean[i]/stdErr[i]);
     1511    if(!t.IsKnown())
     1512    {
     1513      statValue = t;
     1514      refuseProb = 1;
     1515      break;
     1516    }
     1517    else if(statValue > t)
     1518    {
     1519      statValue = t;
     1520    }
     1521  }
     1522  refuseProb = 2*(1-T.Dist(statValue));
     1523  return(true);
     1524}
     1525
     1526//--------------------------------------------------------------------
     1527bool Diagnostic_NormalReg_ParamMulticolinearity(
     1528  BDat& statValue,
     1529  BDat& refuseProb,
     1530  const BArray<BDat>& mean,
     1531  const BArray<BDat>& covEigenValues,
     1532  const BMatrix<BDat>& covEigenVectors,
     1533  int dataLength,
     1534  BDat standardError)
     1535//--------------------------------------------------------------------
     1536{
     1537  int numParam = mean.Size();
     1538  if(!numParam) { return(false); }
     1539  if(covEigenValues.Size()!=numParam ||
     1540     covEigenVectors.Rows()!=numParam ||
     1541     covEigenVectors.Columns()!=numParam ||
     1542     standardError.IsUnknown())
     1543  {
     1544    statValue = BDat::Unknown();
     1545    refuseProb = 1;
     1546    return(true);
     1547  }
     1548  int i,j;
     1549  BTStudentDist T(dataLength-numParam);
     1550  statValue = 0;
     1551  for(j=0; j<numParam; j++)
     1552  {
     1553    BDat c = 0;
     1554    for(i=0;i<numParam;i++) { c +=mean[i]*covEigenVectors(i,j); }
     1555    BDat d = Sqrt(covEigenValues(i));
     1556    BDat s = standardError/d;
     1557    BDat t = c/s;
     1558    BDat p = 2*(1-T.Dist(Abs(t)));
     1559    if(p>statValue)
     1560    {
     1561      statValue = t;
     1562      refuseProb = p;
     1563    }
     1564  }
     1565  return(true);
     1566}
     1567
     1568//--------------------------------------------------------------------
     1569bool Diagnostic_ARIMA_ParamUnitRoots(
     1570  BDat& statValue,
     1571  BDat& refuseProb,
     1572  const BArray<BARIMAFactor>& factors,
     1573  const BMatrix<BDat>& z,
     1574  const BMatrix<BDat>& w0,
     1575  const BMatrix<BDat>& a0)
     1576//--------------------------------------------------------------------
     1577{
     1578  BARIMA arima;
     1579  arima.PutFactors(factors);
     1580  arima.PutOutputData(z);
     1581
     1582  statValue = 0;
     1583  refuseProb = 1;
     1584  return(true);
     1585}
     1586
     1587
     1588
Note: See TracChangeset for help on using the changeset viewer.