【发布时间】:2020-07-11 20:42:51
【问题描述】:
我正在尝试编写一个创建假设数据的函数。该函数获取一个相关矩阵 (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?
希望这足够清楚。感谢所有帮助。
【问题讨论】:
标签: r