коррелированные нормальные случайные величины с произвольным rho (corrcoef) - PullRequest
0 голосов
/ 11 октября 2018

У меня есть вопрос о генерации коррелированных случайных величин ... есть ли способ генерировать x1 (0, 1), x2 (0, 1), которые обычно имеют rho = 0;или сгенерировать x3 (0, 1), x4 (0, 1), чтобы rho = 0,75 или что-то еще?

я пробовал это до сих пор

1- независимый нормальный генератор:

vector<double> uncorr_normal(double m, double s, int n)
{
random_device seed;
mt19937 gen{ seed() };

normal_distribution<> dist{ m, s };

vector<double> samples;
for (int i = 0; i < n; i++)
{
    samples.push_back(dist(gen));
}
return samples;
}

2- зависимый нормальный генератор:

pair<vector<double>, vector<double>> 
corr_normal(double m1, double s1, double m2, double s2, double rho, int n)
{
vector<double> X;
vector<double> Y;

random_device seed;
mt19937 gen{ seed() };

normal_distribution<> dist1{ m1, s1 };
normal_distribution<> dist2{ m2, s2 };

for (int i = 0; i < n; i++)
{
    double x = dist1(gen);
    X.push_back(x);
    double y = rho * x + sqrt(1 - rho * rho) * dist2(gen);
    Y.push_back(y);
}
pair<vector<double>, vector<double>> pair(X, Y);
return pair;

}

я измеряю коэффициент корреляции с помощью функции, которую я реализовал ниже:

double rho(vector<double>& X, vector<double>& Y)
{
double sum_X = 0, sum_Y = 0, sum_XY = 0;
double squareSum_X = 0, squareSum_Y = 0;
//------------------------------------------
size_t n = max(X.size(), Y.size());
//------------------------------------------
for (int i = 0; i < n; i++)
{
    // sum of elements of array X.
    sum_X = sum_X + X[i];

    // sum of elements of array Y.
    sum_Y = sum_Y + Y[i];

    // sum of X[i] * Y[i].
    sum_XY = sum_XY + X[i] * Y[i];

    // sum of square of array elements.
    squareSum_X = squareSum_X + X[i] * X[i];
    squareSum_Y = squareSum_Y + Y[i] * Y[i];
}

// use formula for calculating correlation coefficient.
double corr = (double)(n * sum_XY - sum_X * sum_Y)
    / (double)(sqrt((n * squareSum_X - sum_X * sum_X)
        * (n * squareSum_Y - sum_Y * sum_Y)));

//------------------------------------------
return corr;

}

однако, если я генерирую две некоррелированные случайные величины и проверяю их с помощью функции rho, я не получаю rho = 0;

и для коррелированного случая, если я подключаю случайные коррелированные векторы, я не получаю заданныйRho либо.

Вы можете помочь мне с этим, пожалуйста?

С наилучшими пожеланиями

1 Ответ

0 голосов
/ 11 октября 2018

В коррелированном случае вы должны создать стандартные нормальные выборки, а затем преобразовать и скоррелировать их:

pair<vector<double>, vector<double>>
corr_normal(double m1, double s1, double m2, double s2, double rho, int n)
{
    vector<double> X;
    vector<double> Y;

    random_device seed;
    mt19937 gen{ seed() };

    normal_distribution<> dist1{ 0.0, 1.0 };
    normal_distribution<> dist2{ 0.0, 1.0 };

    for (int i = 0; i < n; i++)
    {
            double x = dist1(gen);
            X.push_back(m1 + x * s1);
            double y = m2 + s2*(rho * x + sqrt(1 - rho * rho) * dist2(gen));
            Y.push_back(y);
    }
    pair<vector<double>, vector<double>> pair(X, Y);
    return pair;
}

См. http://www.statisticalengineering.com/bivariate_normal.htm

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...