Я пытаюсь написать функцию, которая создает гипотетические данные. Функция получает корреляционную матрицу (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?
Надеюсь, это достаточно ясно. Я ценю любую помощь.