2016-08-15 1 views
1

Here is the image showing what i need to calculate. Извините total_r в изображении на самом деле test_gain в коде и гамма в pic ссылается на альфу в коде (Извините). Также на изображении я прекращаю вычисление при t = 3, но на самом деле я хочу рассчитать его до последнего значения, равного 0,6.применять функцию вместо вложенного цикла с операторами if

Я довольно новичок в применении семейства функций. Я обычно использую циклы, но я слышал, что использование функции apply вместо вложенных для циклов намного быстрее. Я попробовал пару учебных пособий, но все же не смог заменить свой вложенный цикл for функцией apply. Любая помощь будет принята с благодарностью, а ниже - код, который я пытаюсь изменить.

В основном это то, что я пытаюсь сделать: первая строка данных: взять значение из столбца + альфа * следующее значение этого столбца (строка 2) + альфа^2 * следующее значение столбца (строка3) + alpha^3 * следующее значение столбца (строка 4) и т. д. до последней строки. Каждый раз, когда я увеличиваю мощность до Alpha.

Все эти расчеты были для первого ряда. Теперь для второй строки я проигнорирую первое значение из столбца, но все последующие значения будут принимать одинаковые значения. Ниже мой код работает отлично, но это займет слишком много времени, чтобы выполнить.

#value of alpha 
alpha <- 0.85 

# test_gain is a vector containing values from a column belonging to a data frame 
test_gain <- testdata$Total_rew 

# initialise the variables 
s = 0 
d = rep(0,nrow(testdata)) 

for (i in 1:nrow(testdata[1:4999,])){ 
    d[i] = test_gain[i] 
    for (s in (i+1):nrow(testdata)){ 
    d[i] = d[i] + alpha^(s-i) * test_gain[s] 
    if (alpha^(s-i) < (10^-5)) {next()} 

    } 
} 
+0

Что такое гамма, и почему вы не печатаете, если гамма меньше 10^-5? – aichao

+0

Как правило, в R вы захотите векторизовать свой код и избегать циклов, когда это возможно. Применимое семейство имеет петли в своем коде. Посмотрите статьи по векторизации – hedgedandlevered

+0

извините, что это была опечатка. гамма была фактически альфа. Я изменил его сейчас. Единственная причина, по которой я пропускаю итерацию, когда альфа меньше 10^-5, - это просто ускорить весь процесс. Потому что, когда альфа достигает 10^-5, все, что после этого будет настолько маленьким, что мне не нужно добавлять его к моим суммам –

ответ

0

Ключ для создания верхней треугольной матрицы размером N степенного ряда alpha где N это число строк в testdata который выглядит следующим образом:

1 alpha alpha^2 alpha^3 ... alpha^(N-1) 
0 1 alpha alpha^2 ... alpha^(N-2) 
0 0  1  alpha ... alpha^(N-3) 
0 0  0  1  ... alpha^(N-4) 
...       ... 
0 0  0  0    1 

Затем вычисление просто умножает матрицу на столбец testdata$Total_rew.

Для создания этой верхней треугольной матрицы (адаптировано из this SO question/answer):

## This will work for both nrow(testdata) is odd and even 
nr <- ceiling(nrow(testdata)/2 - 1) 
mat <- outer(alpha^(-nr:nr), alpha^(-nr:nr)) 
## reverse the columns 
mat <- mat[,rev(seq.int(ncol(mat)))] 
## what we want is in the lower triangular, so set the upper triangular to zeroes 
mat[upper.tri(mat)] <- 0 
## take the transpose so what we want is now upper triangular 
mat <- t(mat) 

Затем

d <- mat %*% testdata$Total_rew 

Заметим также, что вам не нужно переставлять mat на последнем шаге выше. Если вы не транспонировать mat на последнем шаг выше, это также даст тот же результат:

d <- testdata$Total_rew %*% mat 

Надеется, что это помогает.

+0

Это, безусловно, помогает, спасибо. Я попробую, как вы предложили, и посмотрите, соответствуют ли результаты предыдущим значениям, полученным ранее, с помощью вложенного цикла.Если этот способ работает, я вижу, что это значительно сокращает время вычислений –

+0

Могу ли я предположить, что для сравнения вы не останавливаете серию, когда alpha^(s-i) меньше 10^-5? Я также отредактирую ответ, но это не повлияет на результаты. – aichao

+0

Да, ваше право, я вынесу эту строку кода и оставлю ее бегущей ночью. Спасибо –