c++ - 具有任意 rho(corrcoef) 的相关正态随机变量
问题描述
我对生成相关随机变量有疑问...有没有办法生成 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。
你能帮我解决这个问题吗?
此致
解决方案
在相关情况下,您必须创建标准正态样本,然后对它们进行转换和关联:
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;
}
推荐阅读
- twilio - twlio 中通知服务的绑定计数
- docker - Kubernetes 没有从 JFrog 私有注册表中提取图像
- flutter - 我有两个必须互相倾听的集团,我如何将一个作为参数传递给另一个?
- matplotlib - jupyter notebook matplotlib 显示绘图,然后在原图上绘图
- pandas - 比较字符串时的 PValueError 在熊猫数据框中
- c# - 如何在按钮按下统一时缓慢添加到对象 Z 比例
- javascript - 通过 POST 将数据从 javascript 传递到 PHP 不起作用
- python - python多线程线程的成员函数如何调用类外的函数
- pandas - pandas 读取 IRS 空格分隔的 txt 数据
- reactjs - 使用 StaticRouter 和 MemoryRouter 进行测试有什么区别