将正态随机变量与任意 RHO(corrcoef) 相关联
correlated normal random variables with arbitrary 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;
}
请参阅 http://www.statisticalengineering.com/bivariate_normal.htm
相关文章:
- 关联容器的下界复杂性:成员函数与非成员函数
- std::future_error:无关联状态
- 查找自动生成键并具有线性内存消耗的小型关联数组
- 如何在 OpenCV 中将图像与另一个图像相关联
- 删除提升存档对象也会删除与其关联的流?
- 变量如何以及在何处可能没有C++关联的名称?
- 将正态随机变量与任意 RHO(corrcoef) 相关联
- 试图(稍微)概括C++模板.关联容器键:值反转
- 如何打印源文件中与 GDB 中的程序流关联的所有行号
- 当前不会命中断点。没有调试器目标代码类型的可执行代码与此文件关联
- 与 std::unique_ptr 和抽象类关联的编译错误
- 如何创建一个对象创建函数,该函数将由与其关联的名称调用?
- 访问与使用 TraceLoggingWrite 提供的事件关联的用户数据
- 创建一个结构的关联数组,以创建一个缓冲区,供键快速访问
- 如何在 c++ 中创建分组多重映射键和关联值的表
- 为什么标准关联有序容器允许"const char*"作为其键?
- 如何使用 PHPCPP 传递对象数组,遍历每个对象并返回关联数组
- 枚举的复合赋值运算符真的应该根据其关联的算术运算符来定义吗?
- 如何使用 Ryzen 7 修复 Windows 上 Qt 5.9 线程的处理器关联
- 这些代码如何相互关联?