如何在MATLAB中生成相关数据,具有预先指定的SD和平均值?

时间:2014-03-24 03:16:17

标签: matlab

我希望创建一个数据点向量,平均值为50,标准差为1.然后,我希望再次创建第二个数据点向量,平均值为50,标准差为1,与第一个向量的相关性为0.3。数据点的数量并不重要,但理想情况下我会有100个。

Generating two correlated random vectors中提到的方法没有回答我的问题,因为(由于随机抽样)SD和均值偏离了所需的数字太多。

2 个答案:

答案 0 :(得分:1)

我找到了一个方法,虽然它很难看。我仍然会欢迎一个答案,详细说明了一种更优雅的方法来获得我想要的东西。

z = 0;

while z < 1
    mu = 50
    sigma = 1
    M = mu + sigma*randn(100,2);
    R = [1 0.3; 0.3 1];
    L = chol(R)
    M = M*L;
    x = M(:,1);
    y = M(:,2);
    if (corr(x,y) < 0.301 & corr(x,y) > 0.299) & (std(x) < 1.01 & std(x) > 0.99) & (std(y) < 1.01 & std(y) > 0.99);
    z = 1;
    end
end
然后,我计算了矢量y的平均值,并计算出它高于50的平均值。然后我从向量y中的每个元素中减去该数字,以便将平均值减少到50。

答案 1 :(得分:0)

你可以一起创建两个向量...我不明白你单独定义它们的原因。这是多变量分布的概念(只是为了确保我们有相同的术语)...... 无论如何,我猜你几乎已经在我所谓的最简单的方法那样做了:

方法1:

使用matlab函数mvnrnd [请记住,mvnrnd使用可以根据相关性和方差计算的协方差矩阵)

方法2:

我不太确定,但我认为它与你正在做的非常接近(实际上我怀疑与if (corr(x,y) < 0.301 & corr(x,y) > 0.299) & (std(x) < 1.01 & std(x) > 0.99) & (std(y) < 1.01 & std(y) > 0.99)有关)我不明白你必须这样做的原因。请参阅主题&#34;从分布中绘制值&#34;在维基百科Multivariate normal distribution