Изменение корреляционной матрицы в ковариальную матрицу Matlab - PullRequest
0 голосов
/ 07 ноября 2018

Я пытаюсь изменить корреляционную матрицу на ковариационную матрицу ...

При импортировании некоторых данных я обнаружил ковариантность (sigma_a)

sigma_a = (sigma_d + (mu_d'+1)*(mu_d+1)).^N - (mu_d'+1).^N *(mu_d+1).^N;

Что возвращает ...

0.1211    0.0231    0.0422    0.0278    0.0411    0.0354    0.0289    0.0366    0.0343    0.0165
0.0231    0.0788    0.0283    0.0242    0.0199    0.0248    0.0219    0.0199    0.0253    0.0140
0.0422    0.0283    0.1282    0.0339    0.0432    0.0366    0.0321    0.0399    0.0420    0.0216
0.0278    0.0242    0.0339    0.0554    0.0261    0.0294    0.0312    0.0269    0.0297    0.0164
0.0411    0.0199    0.0432    0.0261    0.0849    0.0289    0.0271    0.0371    0.0317    0.0173
0.0354    0.0248    0.0366    0.0294    0.0289    0.0728    0.0293    0.0400    0.0339    0.0149
0.0289    0.0219    0.0321    0.0312    0.0271    0.0293    0.0454    0.0276    0.0309    0.0135
0.0366    0.0199    0.0399    0.0269    0.0371    0.0400    0.0276    0.0726    0.0356    0.0162
0.0343    0.0253    0.0420    0.0297    0.0317    0.0339    0.0309    0.0356    0.0715    0.0198
0.0165    0.0140    0.0216    0.0164    0.0173    0.0149    0.0135    0.0162    0.0198    0.0927

Тогда я нашел корреляционную матрицу (ро)

rho = inv(sqrt(diag(diag(sigma_a))))*sigma_a*inv(sqrt(diag(diag(sigma_a))));  

Что возвращает ...

  1.0000    0.2365    0.3388    0.3396    0.4050    0.3772    0.3897    0.3899    0.3686    0.1556
  0.2365    1.0000    0.2812    0.3656    0.2437    0.3274    0.3658    0.2631    0.3377    0.1638
  0.3388    0.2812    1.0000    0.4027    0.4141    0.3792    0.4199    0.4133    0.4382    0.1985
  0.3396    0.3656    0.4027    1.0000    0.3809    0.4638    0.6221    0.4246    0.4728    0.2295
  0.4050    0.2437    0.4141    0.3809    1.0000    0.3681    0.4366    0.4732    0.4068    0.1948
  0.3772    0.3274    0.3792    0.4638    0.3681    1.0000    0.5093    0.5499    0.4707    0.1813
  0.3897    0.3658    0.4199    0.6221    0.4366    0.5093    1.0000    0.4797    0.5428    0.2079
  0.3899    0.2631    0.4133    0.4246    0.4732    0.5499    0.4797    1.0000    0.4936    0.1971
  0.3686    0.3377    0.4382    0.4728    0.4068    0.4707    0.5428    0.4936    1.0000    0.2435
  0.1556    0.1638    0.1985    0.2295    0.1948    0.1813    0.2079    0.1971    0.2435    1.0000

Я знаю, что в matlab есть функция corrcov (), которая находит корреляционную матрицу ... Итак, я попытался,

 corrcov(sigma_a) 

Я сравнил результаты, и оба corrcov (sigma_a) и rho создали одну и ту же матрицу корреляции. Однако тогда я хотел изменить все попарные корреляции точно на +0.1. Что я и сделал, с

rho_u = (rho + .1) - .1*eye(10); 

И я получил следующую корреляционную матрицу ...

  1.0000    0.3365    0.4388    0.4396    0.5050    0.4772    0.4897    0.4899    0.4686    0.2556
  0.3365    1.0000    0.3812    0.4656    0.3437    0.4274    0.4658    0.3631    0.4377    0.2638
  0.4388    0.3812    1.0000    0.5027    0.5141    0.4792    0.5199    0.5133    0.5382    0.2985
  0.4396    0.4656    0.5027    1.0000    0.4809    0.5638    0.7221    0.5246    0.5728    0.3295
  0.5050    0.3437    0.5141    0.4809    1.0000    0.4681    0.5366    0.5732    0.5068    0.2948
  0.4772    0.4274    0.4792    0.5638    0.4681    1.0000    0.6093    0.6499    0.5707    0.2813
  0.4897    0.4658    0.5199    0.7221    0.5366    0.6093    1.0000    0.5797    0.6428    0.3079
  0.4899    0.3631    0.5133    0.5246    0.5732    0.6499    0.5797    1.0000    0.5936    0.2971
  0.4686    0.4377    0.5382    0.5728    0.5068    0.5707    0.6428    0.5936    1.0000    0.3435
  0.2556    0.2638    0.2985    0.3295    0.2948    0.2813    0.3079    0.2971    0.3435    1.0000

Однако, когда я пытаюсь взять скорректированную матрицу корреляции и сделать ее матрицей ковариации, cov () не производит правильную матрицу. Я пытался ...

b = cov(rho_u);

Почему это? Есть ли другой способ сделать это? Или есть способ настроить то, что я сделал с

 rho = inv(sqrt(diag(diag(sigma_a))))*sigma_a*inv(sqrt(diag(diag(sigma_a)))); 

так что он делает обратное (как найти матрицу корреляции), чтобы получить вместо этого матрицу ковариации?

Исходя из моего понимания из приведенного ниже ответа, тогда ковариационная матрица для rho_u будет достигнута путем выполнения ...

sigma = sqrt(var(rho_u));
D = diag(sigma); 
sigma_u = D*rho_u*D

Это то, что имелось в виду? Меня немного смущало, к каким переменным я должен относиться. Я думал, что значит rho_u?

1 Ответ

0 голосов
/ 07 ноября 2018

Функция MATLAB cov не определена для преобразования корреляционной матрицы в ковариационную матрицу, как указано в ее документации

cov(X), if X is a vector, returns the variance.  For matrices, where 
each row is an observation, and each column a variable, cov(X) is the 
covariance matrix.

Так что просто подать корреляционную матрицу на cov() не получится. Что вам нужно для расчета ковариационной матрицы - это дисперсия ваших переменных (которую вы можете рассчитать по вашим данным, но не публиковать здесь)

Итак, в вашем примере вы используете 10x10 матрицу корреляции rho, которую вы разместили, и используете некоторые случайные числа для стандартных отклонений

sigma = rand(size(rho(:,1)));
D = diag(sigma);         % Make the sigmas appear on the diagonal of an 10x10 matrix

(конечно, вы должны вставить рассчитанные значения из ваших входных данных). Затем вы можете рассчитать ковариационную матрицу по

S = D*rho*D
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...