安德森·达林C++;实施 我尝试在C++中实现大量的时间(HHA)常态检验。这是我的密码。我知道有类似的话题,但不幸的是,它并没有解决我的问题

安德森·达林C++;实施 我尝试在C++中实现大量的时间(HHA)常态检验。这是我的密码。我知道有类似的话题,但不幸的是,它并没有解决我的问题,c++,statistics,statistical-test,C++,Statistics,Statistical Test,方差计算正确,我猜也是均匀的标准化分布。问题是b和c为我的样本数据1,2…10提供了NAN 你知道公式中的错误在哪里吗?Anderson_Darling()见下面的代码 为了更清晰,代码从类中删除。我没有在这里放一些明显的方法,比如mean()等等 Y[i]可以是负数,您正在读取日志。此外,我看不出您在哪里使用phi功能。您是对的,这是我的版本号56:-D。明天我将尝试更正代码。不过,我认为日志(负值)会有问题,它给出了复数。如何处理这个问题?在维基百科页面上,他们提到要记录F(Y[i]),总是

方差计算正确,我猜也是均匀的标准化分布。问题是b和c为我的样本数据1,2…10提供了NAN

你知道公式中的错误在哪里吗?Anderson_Darling()见下面的代码

为了更清晰,代码从类中删除。我没有在这里放一些明显的方法,比如mean()等等


Y[i]
可以是负数,您正在读取
日志。此外,我看不出您在哪里使用
phi
功能。您是对的,这是我的版本号56:-D。明天我将尝试更正代码。不过,我认为日志(负值)会有问题,它给出了复数。如何处理这个问题?在维基百科页面上,他们提到要记录
F(Y[i])
,总是正面的,其中
F()
是CDF,而不是
Y[i]
,如果我理解得很好,
phi
是CDF,但是你在哪里使用它呢?CDF总是正的(或空的),我纠正了程序,因为那里缺少phi(),现在它计算正确。泰克斯达米恩。
double variance()
{
    double var_sum = 0.0;
    for(int i = 0; i < int(size); i++)            //(size is taken from a class)
        var_sum += pow(data.at(i)-mean(),2);
    return var_sum / (int(size)-1);
}

double phi(double x)
{
    double res =0.5 * erfc(-x * M_SQRT1_2);
    return res;
}

vector<double> tostdnormal()
{
    vector<double> Y (size);
    for(int i = 0; i < int(size); i++)
        Y.at(i) = (data.at(i) - mean())/(sqrt(variance()));
    return Y;
}

double Anderson_Darling()
{
    sort(data.begin(),data.end());
    int n = int(size);
    vector<double> Y = tostdnormal();

   double S = 0; double a = 0; double b = 0; double c = 0;
    for(int i = 0; i < n; i++)
    {
        a = 2.0 * (i+1) - 1;
        b = log(Y.at(i));
        c = log(1-Y.at(n-i-1));
        S += a * (b + c);
     }
return -n - S / n;


 }
b = log(phi(Y.at(i)));
c = log(1-phi(Y.at(n - i - 1)));