Как получить T-Stat и P-Value из OLSMultipleLinearRegression

Со следующим кодом, взятым из примеров... Как мне получить p-значение и t-стат, которые вы найдете в выходных данных, таких как Excel?

  OLSMultipleLinearRegression regression2 = new OLSMultipleLinearRegression();
  double[] y = { 4, 8, 13, 18};
  double[][] x = {{ 1, 1, 1  },
                  { 1, 2, 4  },
                  { 1, 3, 9  },
                  { 1, 4, 16  }};

  regression2.newSampleData(y, x);
  regression2.setNoIntercept(true);
  double[] beta = regression2.estimateRegressionParameters();

  for (double d : beta) {
     System.out.println("D: " + d);
  }

После публикации этого вопроса я решил часть t-stat:

  for (int i=0; i < beta.length; i++){
     double tstat = beta[i] / regression.estimateRegressionParametersStandardErrors()[i];
     System.out.println("t-stats(" +i +") : " +tstat );
  }

person Mike Samaras    schedule 10.11.2015    source источник
comment
Вы уверены, что этот второй блок кода верен в отношении расчета t-stat? Я просто запустил аналог для себя и получил смехотворно высокие значения.   -  person Peter Kazazes    schedule 01.02.2016
comment
Проверьте мое редактирование в моем ответе ниже. Соответствует excel. Ваш tstat, конечно, сильно зависит от качества вашей регрессии.   -  person Mike Samaras    schedule 11.02.2016


Ответы (1)


  int residualdf = regression.estimateResiduals().length-beta.length;
  for (int i=0; i < beta.length; i++){
     double tstat = beta[i] / regression.estimateRegressionParametersStandardErrors()[i];

     double pvalue = new TDistribution(residualdf).cumulativeProbability(-FastMath.abs(tstat))*2;

     System.out.println("p-value(" +i +") : " +pvalue );
  }

Это даст вам p-значения. Он в любом случае не оптимизирован, но значения идеально совпадают.

Я обновил свой код до приведенного ниже, чтобы учесть комментарии. Он соответствует Excel.

      final double[] beta = regression.estimateRegressionParameters();
  final double[] standardErrors = regression.estimateRegressionParametersStandardErrors();
  final int residualdf = regression.estimateResiduals().length - beta.length;

  final TDistribution tdistribution = new TDistribution(residualdf);

  //calculate p-value and create coefficient
  final Map<RegressionCoefficientNames, RegressionCoefficient> coefficientMap = new HashMap<>(beta.length);
  for (int i = 0; i < beta.length; i++)
  {
     double tstat = beta[i] / standardErrors[i];
     double pvalue = tdistribution.cumulativeProbability(-FastMath.abs(tstat)) * 2;
     final RegressionCoefficient coefficient = new RegressionCoefficient(extensionModelType.getNameByIndex(i),
                                                                         beta[i],
                                                                         standardErrors[i],
                                                                         tstat,
                                                                         pvalue);

     coefficientMap.put(extensionModelType.getNameByIndex(i), coefficient);
  }

Вот улучшенный код. я соответствую

class RegressionCoefficient {
    private final RegressionCoefficientNames valueName;
    private final Double coefficient;
    private final Double standardError;
    private final Double tStat;
    private final Double pValue;
}
person Mike Samaras    schedule 10.11.2015
comment
где находится RegressionCoefficientNames, RegressionCoefficient? - person Yeahia2508; 05.09.2017
comment
public enum RegressionCoefficientNames { INTERCEPT, PROXY_PRICE, PROXY_PRICE_SQUARED, TIME_TO_MATURITY, JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER //DECEMBER //Декабрь не используется. } - person Mike Samaras; 06.09.2017