Сохранить вывод корреляции из цикла в матрицу

У меня есть установка, которая выглядит ниже

for(V in (seq(1, 250, by = 5))){
   for(n in (seq(1, 250, by = 5))){

        # 1) Working Algorithm creating a probability 
             ie. vector in range [0:1] 

        # 2) Take the natural log of this probability 
        a <-  log(lag(Probability), base = exp(1))

        # 3) calculate price differences
        b <-  abs(diff(Price) -1)

        # 4) Then compute correlation between a and b
        cor(a, b) 

        # 5) Here I'd like to save this in the corresponding index of matrix
   }
}

Так что я получаю на выходе матрицу размером [V, n], которая собирается из каждого цикла.

У меня есть несколько проблем с этим.

  • Первая проблема заключается в том, что моя корреляция не поддается вычислению, поскольку Probability часто равно 0, создавая вход ln(0) = -Inf в векторе ln(Probability). Есть ли способ вычислить std.dev или cor вектора Ln с входными данными -Inf?

  • Мой второй вопрос: как сохранить этот вывод корреляции в матрицу, сгенерированную для каждого цикла?

Спасибо за вашу помощь. Надеюсь, это достаточно ясно.


person Morten    schedule 28.01.2013    source источник
comment
Почему вы берете журнал переменной, которая часто равна 0?   -  person Roland    schedule 28.01.2013
comment
... вместо этого вы можете использовать log(x + 1)...   -  person Paul Hiemstra    schedule 28.01.2013
comment
Я добавил +1, как вы предложили. Корреляция не изменится, если я добавлю константу.   -  person Morten    schedule 28.01.2013


Ответы (2)


Что касается вашего второго вопроса (мой второй вопрос: как сохранить этот вывод корреляции в матрицу, сгенерированную для каждого цикла?), вы можете инициализировать матрицу перед циклом и сохранить каждую вычисленную корреляцию в соответствующем индексе, например:

sz <- seq(1, 250, by = 5)
out_mat <- matrix(0, nrow=length(sz), ncol=length(sz))
# then continue with your for-loop
for (V in 1:length(sz)) {
    for(n in length(sz)) {
        # here instead of accessing V and n in computing probability
        # use sz[V] and sz[n]
        ...
        ...
        # after computing the correlation, here use V and n (not sz[V] or sz[n])
        out_mat[V, n] <- c # c holds the value of cor(a,b)
    }
 }
person Arun    schedule 28.01.2013
comment
С помощью этой функции я получаю «индекс вне границ». Вы знаете, что вызывает эту ошибку? - person Morten; 28.01.2013
comment
Да, это была глупая ошибка. Теперь я изменил код. Смотрите встроенные комментарии. По сути, используйте этот код и замените V и n везде на sz[V] и sz[n], кроме out_mat[V, n] - person Arun; 28.01.2013
comment
Я не запускаю его, и он, кажется, работает. Спасибо за вашу помощь! - person Morten; 28.01.2013
comment
У меня проблема с запуском вашего решения. Мне нужны циклы for V и n, чтобы взять номер последовательности сз. Если я использую V в 1:length(sz) с sz, равным, скажем, seq(1, 10, by = 5), тогда V примет 1 и 2, когда должно быть 1 и 6. Я получаю сообщение об ошибке при попытке V в seq(1, 10, by = 5). Знаете ли вы, что вызывает ошибку нижнего индекса за пределами границ? - person Morten; 29.01.2013
comment
Я сказал об этом в своем предыдущем комментарии и прокомментировал в коде. Вы можете получить доступ к 1 и 6, выполнив sz[V], и вы можете сохранить в матрице, используя V = 1, 2 - person Arun; 29.01.2013
comment
Разница между sz[V] и V сбила меня с толку. Теперь он работает, как задумано. Спасибо еще раз. - person Morten; 29.01.2013
comment
рад, что ты понял. Я признаю, что это может запутать! - person Arun; 29.01.2013

Что вы можете сделать с -Inf, так это заменить его на NA, например:

x = runif(10)
x[3] = 1/0
> is.infinite(x)
 [1] FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
x[is.infinite(x)] <- NA
> x
 [1] 0.09936348 0.66624531         NA 0.90689357 0.71578917 0.14655174
 [7] 0.59561047 0.41944552 0.67203026 0.03263173

И используйте аргумент na.rm для sd:

>  sd(x, na.rm = TRUE)
[1] 0.3126829
person Paul Hiemstra    schedule 28.01.2013