【问题标题】:correlated normal random variables with arbitrary rho(corrcoef)具有任意 rho(corrcoef) 的相关正态随机变量
【发布时间】:2019-03-16 03:49:36
【问题描述】:

我对生成相关随机变量有疑问...有没有办法生成 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。

你能帮我解决这个问题吗?

最好的问候

【问题讨论】:

  • 我只是用 100.00 次模拟运行你的代码,它看起来还不错。在不相关的情况下,它产生 0.00383497,在与rho=0.5 相关的情况下,它产生 0.503739。也许您的样本量不够大?
  • 我已经对“rho = 0.75”进行了 1000 次迭代测试,它在 (0, 1) 之间有很大的容差
  • 我尝试了 1000 次模拟和rho=0.75。我重复此步骤 100 次,rho 的结果是 0.752059(平均)0.711403(最小)0.789449(最大)。
  • 我真的不知道我做错了什么...好的,谢谢...我会尝试不同的样本大小和迭代,希望得到结果...有没有更有效的方法执行此操作?有什么建议吗?
  • 其实我只测试了标准的正常情况。在其他情况下,您的相关构造不正确。

标签: c++ math statistics


【解决方案1】:

在相关情况下,您必须创建标准正态样本,然后对它们进行转换和关联:

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

【讨论】:

  • 谢谢你,亲爱的 max。如果我们有 rho = 0.1 的 x1(5, 1) 和 x2(8, 1),我们可以通过更改参数轻松地将它们转换为“rho = 0.9”。即将它们更改为 x1(5, 1.5) 和 x2(8.5, 2)。我们可以这样做吗?
  • 如果您对上述问题有任何想法,我不胜感激?
  • 我不完全理解你的问题。您有样本 x~N(5,1), y~N(8,1),它们通过 rho=0.1 相关。为什么要将它们转换为 rho=0.9 的 x1~N(5,1.5), y1~N(8.5,2)?再次采样有什么问题?
  • 我只想更改 rho 值以及缩放法线,这将是我项目的更好理由
猜你喜欢
  • 2015-02-27
  • 2014-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-23
  • 2015-03-15
相关资源
最近更新 更多