R中的嵌套For循环

时间:2016-02-05 14:40:58

标签: r loops

这只是一个简单的问题,但我真的花了很多时间,因为我是R的新人。

我试图为组合的方差编写代码。

enter image description here

例如,我有以下内容: -

weight=c(0.3,0.2,0.5)
cov  = matrix( c(0.2, 0.4, 0.3, 0.4, 0.5, 0.3,0.3,0.3,0.4),nrow=3, ncol=3, byrow = TRUE)

for (i in 1:3){
for (j in 1:3) {
port = sum((weight[i]^2) * (cov[i,i]^2)) + sum(weight[i] *weight[j]* cov[i,j]) }}

如果我手动计算,答案应为0.336。但是R给了我port=0.12这是错的。我的错误在哪里?

1 个答案:

答案 0 :(得分:1)

首先计算矩阵乘积w %*% t(w)

tcrossprod(weight)
#     [,1] [,2] [,3]
#[1,] 0.09 0.06 0.15
#[2,] 0.06 0.04 0.10
#[3,] 0.15 0.10 0.25

然后将其与方差 - 协方差矩阵相乘并取所有元素的总和:

sum(tcrossprod(weight) * cov)
#[1] 0.336

或作为循环(效率低下):

port <- 0
for (i in 1:3){
  for (j in 1:3) {
    port  <- if (i == j) {
      port + sum((weight[i]^2) * (cov[i,i]))
    } else {
      port + sum(weight[i] *weight[j]* cov[i,j])
    } 
  }
}
port
#[1] 0.336

请注意,方差 - 协方差矩阵通常包含对角线上的方差(sigma_i ^ 2)。