R: небольшая ошибка в моем цикле - отдельные части цикла верны, кроме полной функции - PullRequest
0 голосов
/ 16 июля 2011

Можете ли вы исправить мою функцию цикла.Я хочу рассчитать соотношение колонн моих матриц a и b.Выходными данными должен быть цикл корреляции первых 3 строк a и b, а затем оставшихся 3 (не корреляционная матрица).Мой код ниже.

a=read.table("H:/cor1.txt",header=T)
b=read.table("H:/cor2.txt",header=T)
t=as.matrix(a)
y

          d     e    f
   [1,]   6    -5    7
   [2,]   7    -4    4
   [3,]   8    -3    3
   [4,]   9    -2    3
   [5,]  10    -1    9
   [6,]  11     0    7


t
         a     b    c
  [1,]   1    -1    4
  [2,]   2    -2    6
  [3,]   3    -3    9
  [4,]   4    -4   12
  [5,]   5    -5    6
  [6,]   6    -6    5

y=as.matrix(b)
n=3  #number to consider at a time
runs=2 #runs multiplied by number of shares be looked at
Corrs=matrix(0, nrow=2,3) #100 is number of shares being looked at
for (i in 1:runs){
    index_start = n*(i-1)+1  #replace 100 with days in a quater
    index_end = n*i  #replace 100 with days in a quater
    use_index = index_start:index_end
    Corrs[i] = diag(cor(t[use_index,],y[use_index,]))
}

Warning messages:

1: In Corrs[i] = diag(cor(t[use_index, ], y[use_index, ])) :
  number of items to replace is not a multiple of replacement length
2: In Corrs[i] = diag(cor(t[use_index, ], y[use_index, ])) :
  number of items to replace is not a multiple of replacement length

Corrs

     [,1] [,2] [,3]
[1,]    1    0    0
[2,]    1    0    0

правильный ответ должен быть матрицей с двумя строками ниже, соответственно

diag(cor(t[1:3,],y[1:3,]))

[1]  1.0000000 -1.0000000 -0.9226129

diag(cor(t[4:6,],y[4:6,]))

[1]  1.0000000 -1.0000000 -0.8934051

Ответы [ 2 ]

0 голосов
/ 19 июля 2011

для corrs [i], измените его на corrs [i,]

0 голосов
/ 16 июля 2011

Мне очень неясно, что вы пытаетесь сделать со своим кодом (см. Справку по форматированию кода), но если я правильно понимаю конец вашего вопроса, разве это не то, что вы хотите:

rbind(diag(cor(t[1:3,],y[1:3,])),diag(cor(t[4:6,],y[4:6,]))

EDIT

ОП, по-видимому, хочет, чтобы корреляции вычислялись в цикле и помещались по одному в результирующую матрицу. Для будущих читателей этого вопроса, имейте в виду, что этот стиль кода очень не похож на R, часто медленный и неэффективный, и редко рекомендуется.

Определить матрицы:

y <- cbind(6:11,(-5):(0),c(7,4,3,3,9,7))
x <- cbind(1:6,(-1):(-6),c(4,6,9,12,6,5))

Я использовал x вместо t, потому что t - это имя очень часто используемой матричной функции (транспонирование), поэтому я предпочитаю избегать ее использования в качестве имени матрицы.

Инициализировать матрицу результатов и цикл:

result <- matrix(NA,2,3)
for (i in 1:2){
    for (j in 1:3){
        result[i,j] <- cor(x[(3*(i-1) + 1):(3*(i-1) + 3),j],y[(3*(i-1) + 1):(3*(i-1) + 3),j])
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...