Заполнение верхнего треугольника метрикса в r - PullRequest
0 голосов
/ 15 марта 2020

У меня есть 3 вектора:

 p
            [,1]
[1,] 0.002715955
[2,] 0.004460214
[3,] 0.006855524
[4,] 0.007438570
[5,] 0.042657555

q
          [,1]
[1,] 0.9972840
[2,] 0.9955398
[3,] 0.9931445
[4,] 0.9925614
[5,] 0.9573424

f
            [,1]
[1,] 0.008364157
[2,] 0.013058930
[3,] 0.019131397
[4,] 0.020559785
[5,] 0.090786054

Я хочу выполнить следующую операцию, чтобы получить матрицу var-cov (которая заполняет только верхний треугольник матрица)

v_ij <- p_i*q_j/(n*f_i*f_j); 1<=i<=j<=n

Где n - количество наблюдений (здесь 5). поэтому я написал следующий код для выполнения кода

v_ij <- matrix(nrow=length(p), ncol=length(p))
for(i in 1:nrow(p)){
  for(j in 1:nrow(q)){
    if(i==j){
      diag(v_ij) <- p[i]*q[j]/(f[i]*f[j])
    }
  }
}


Этот код мог заполнять только диагональ, но я не знал, какая функция может заполнить верхнюю часть матрицы для меня.

Ответы [ 2 ]

0 голосов
/ 15 марта 2020

Может быть, вы можете использовать tcrossprod + lower.tri, например,

v <- tcrossprod(p,q)/tcrossprod(f)/5
v[lower.tri(v)] <- 0

, чтобы

> v
           [,1]  [,2]       [,3]       [,4]       [,5]
[1,] 0.04444444 0.050 0.05333333 0.05555556 0.05714286
[2,] 0.00000000 0.075 0.08000000 0.08333333 0.08571429
[3,] 0.00000000 0.000 0.09600000 0.10000000 0.10285714
[4,] 0.00000000 0.000 0.00000000 0.11111111 0.11428571
[5,] 0.00000000 0.000 0.00000000 0.00000000 0.12244898

ДАННЫЕ

p <- matrix(1:5,nrow = 5,ncol = 1)
q <- matrix(2:6,nrow = 5,ncol = 1)
f <- matrix(3:7,nrow = 5,ncol = 1)
0 голосов
/ 15 марта 2020

Вы можете использовать upper.tri() как предложено для получения верхней части, если это все, что вам нужно. Функция cov() создает полную симметричную матрицу c:

X <- matrix(rnorm(15), ncol=3)
vcov <- cov(X)

Если вы запустите

vcov[upper.tri(vcov, diag=TRUE)]

, то вы только извлекаете элементы, но возвращаете их как вектор, но

vcov*upper.tri(vcov, diag=TRUE)

даст вам то, что вы хотите.

> X <- matrix(rnorm(15), ncol=3)
> vcov <- cov(X)
> vcov[upper.tri(vcov, diag=TRUE)]
[1] 0.2698385 0.2844101 0.9375529 0.1457635 0.0223076 0.1626811
> vcov*upper.tri(vcov, diag=TRUE)
          [,1]      [,2]      [,3]
[1,] 0.2698385 0.2844101 0.1457635
[2,] 0.0000000 0.9375529 0.0223076
[3,] 0.0000000 0.0000000 0.1626811
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...