当前位置: 首页 > 知识库问答 >
问题:

我想根据相关矩阵创建假设数据

艾善
2023-03-14

我试图写一个函数来创建假设的数据。该函数得到一个相关矩阵(R)和一个整数(n)作为输入值。它将创建一个包含n行的数据帧(或矩阵),列之间的二元相关性必须与相关矩阵(R)中的相同。

以下是我迄今为止所拥有的:

我的职能是:

generate_data = function(R, n) {
r.eigen = eigen(R)
factors = t(t(r.eigen$vectors) * sqrt(r.eigen$values))
data = matrix(rnorm(n * ncol(R)), n)
data = data %*% t(factors)
return(data)}

这是我用不同的n得到的输出。

相关矩阵示例:

R = matrix(c(1, .06, -.1, .1, .06, 1, -.51, .14, -.1, -.51, 1, .12, .1,  .14, .12, 1), ncol = 4)

> R
      [,1]  [,2]  [,3] [,4]

[1,]  1.00  0.06 -0.10 0.10

[2,]  0.06  1.00 -0.51 0.14

[3,] -0.10 -0.51  1.00 0.12

[4,]  0.10  0.14  0.12 1.00

这是我可以根据n(行数)得到的相关矩阵。

>  round(cor(generate_data(R, 100)), 2)

      [,1]  [,2]  [,3] [,4]

[1,]  1.00 -0.23  0.09 0.12

[2,] -0.23  1.00 -0.44 0.23

[3,]  0.09 -0.44  1.00 0.09

[4,]  0.12  0.23  0.09 1.00

 >  round(cor(generate_data(R, 1000)), 2)

      [,1]  [,2]  [,3] [,4]

[1,]  1.00  0.05 -0.11 0.10

[2,]  0.05  1.00 -0.51 0.13

[3,] -0.11 -0.51  1.00 0.17

[4,]  0.10  0.13  0.17 1.00

 >  round(cor(generate_data(R, 10000)), 2)

      [,1]  [,2]  [,3] [,4]

[1,]  1.00  0.05 -0.09 0.10

[2,]  0.05  1.00 -0.50 0.13

[3,] -0.09 -0.50  1.00 0.14

[4,]  0.10  0.13  0.14 1.00

我的函数对于大的n似乎工作得相当好,但是对于小的n却不起作用。有没有办法让一个函数也适用于较小的n?

希望这足够清楚。我感谢所有的帮助。

共有1个答案

况庆
2023-03-14

您可以从mvtNorm包中使用rmvNorm()函数。然而,对于小的n,样本变化不太可能稳定下来,您将得到您也在自己的函数中看到的小样本变化。对此你无能为力——那是随机性。

library("mvtnorm")
R <- matrix(c(1, .06, -.1, .1, .06, 1, -.51, .14, -.1, -.51, 1, .12, .1,  .14, .12, 1), ncol = 4)
x <- rmvnorm(n=500, mean=c(0,0,0,0), sigma=R)

这就产生了

cor(x)
           [,1]       [,2]        [,3]       [,4]
[1,]  1.0000000  0.1023989 -0.10946186 0.12230412
[2,]  0.1023989  1.0000000 -0.53853097 0.15985618
[3,] -0.1094619 -0.5385310  1.00000000 0.05587178
[4,]  0.1223041  0.1598562  0.05587178 1.00000000

这似乎与您使用R指定的非常接近。如果我把样本数量增加到10000,我会得到

x <- rmvnorm(n=10000, mean=c(0,0,0,0), sigma=R)
cor(x)
            [,1]        [,2]        [,3]      [,4]
[1,]  1.00000000  0.05969971 -0.08121426 0.1121826
[2,]  0.05969971  1.00000000 -0.51305601 0.1247779
[3,] -0.08121426 -0.51305601  1.00000000 0.1340828
[4,]  0.11218257  0.12477793  0.13408277 1.0000000
 类似资料:
  • 问题内容: 我正在尝试创建一个矩阵以显示Pandas数据框中的行之间的差异。 我要这样: 要变成这样(差异垂直): 这是可以通过内置函数实现的,还是需要构建一个循环以获得所需的输出?谢谢你的帮助! 问题答案: 这是numpy广播的标准用例: 我们使用values属性访问基础的numpy数组,并引入了一个新轴,因此结果是二维的。 您可以将其与原始系列结合使用: 由于@Divakar,也可以使用以下命

  • 我有一个事件日志数据框,每行是一个事件(如查看项目),其中包含列,,以及用户分配项目的。我想创建一个表示所有用户-项目交互的数据框:表示为二维矩阵,每个(i,j)表示用户i和项目j的分数(下图截图)。如果用户尚未看到该产品,则分配NaN。 我试过用循环做这件事,但正如预期的那样,运行时间太长: 有没有更快的方法? 根据评论中的要求,我的数据帧的头部<代码>事件类型与上述分数类似。

  • 问题内容: 我目前正在将数据读入如下所示的数据框中。 我想根据此数据创建一个欧几里得距离矩阵,该矩阵显示所有城市对之间的距离,因此我得到一个结果矩阵,如下所示: 我的实际数据框中还有更多城市和坐标,因此我需要能够以某种方式遍历所有城市对并创建一个距离矩阵,就像上面显示的那样,但是我不确定如何配对所有城市一起引用并应用欧几里德距离公式?任何帮助,将不胜感激。 问题答案: 我认为您对distance_

  • 本文向大家介绍详解numpy矩阵的创建与数据类型,包括了详解numpy矩阵的创建与数据类型的使用技巧和注意事项,需要的朋友参考一下 Numpy是python常用的一个类库,在python的使用中及其常见,广泛用在矩阵的计算中,numpy对矩阵的操作与纯python比起来速度有极大的差距。 一、 构造矩阵 矩阵的构造可以有多种方法: 1.使用python中的方法构造矩阵 - 生成一维矩阵 - 生成二

  • 我有一个带有两个变量X和Y的pandas数据帧(大约1M行),并且希望使用scipy,sparse创建一个稀疏矩阵。输出应该是一个n x m矩阵,如果x=x和Y=Y,则其条目为1。 下面是数据结构的示例 所需的输出为 提前致谢

  • 本文向大家介绍Python中矩阵创建和矩阵运算方法,包括了Python中矩阵创建和矩阵运算方法的使用技巧和注意事项,需要的朋友参考一下 矩阵创建 1、from numpyimport *; a1=array([1,2,3]) a2=mat(a1) 矩阵与方块列表的区别如下: 2、data2=mat(ones((2,4))) 创建一个2*4的1矩阵,默认是浮点型的数据,如果需要时int类型,可以使用