/ / Итерация и записване на контурни изходи с различна дължина [дубликат] - r, loops, plyr

Повторете и запишете изходи на цикъл с различна дължина [дубликат] - r, loops, plyr

Изглежда елементарен въпрос, но аз потърсих и изпробвах няколко опции и не мога да накарам резултатите да се появят. Наистина оценявам помощта по-долу:

Имам колона на възвръщаемостта (dput по-долу) и i „mсглобяването им в цикъл, започващ с всеки елемент до края. "Бих искал да запазя резултата в" резултати ", които предварително инициализирах. Опитах няколко начина за поставяне на резултата в резултати, както се вижда по-долу, но нито един не е успешен. Въпреки това с print (temp) виждам, че изчисленията се случват така, както аз ги харесвам.

Всяка итерация дава отговор на различнидължина, обаче, и искам всеки да е в свой ред (поради което направих допълнително място от NA във вектора). Използването на текущия метод: results = resultstemp не е успешен, тъй като "допълнителните" колони за всички, освен първата итерация, са изпълнени с повторения на началото на резултата. Така например, вторият до последния ред има същите две числа (пълният резултат за съставяне на само две връщания) повторете 12 пъти през целия ред.

    #results=NULL
results=matrix(data=NA,nrow=nrow(returns),ncol=nrow(returns))
for (i in 1:nrow(returns)) {
temp=cumprod(1+returns[i:nrow(returns),]/100)-1
#resultstemp=append(results,temp)
#resultstemp[i,]=temp
resultstemp=rbind(results,temp)
#print(resultstemp)
print(temp)
results=resultstemp
#resultstemp[i,]=temp
#results[i,]=resultstemp
#results[i]=resultstemp[i]
#results[i]=temp[i]
}

Се завръща:

structure(list(`runif(24, 0, 10)` = c(7.60884596500546, 4.31712970370427,
1.7181678651832, 4.86275367671624, 8.06177110411227, 8.07952171890065,
7.45263583026826, 9.86292108893394, 4.06634262995794, 2.36454397207126,
9.12716506049037, 3.72667369898409, 1.2204843852669, 7.80610600719228,
0.640116988215595, 6.94793848553672, 1.73743493855, 2.57189674302936,
4.7653386532329, 1.79362375289202, 7.56623527035117, 2.70907687023282,
4.45359382545575, 5.50409059040248)), .Names = "runif(24, 0, 10)", row.names = c(NA,
-24L), class = "data.frame")

Отговори:

0 за отговор № 1

Ако те разбирам правилно, искаш нещокато долна триъгълна матрица, където първата колона е само първия процент, втората е първата, комбинирана с втората и т.н. И на всеки ред излизате още един период? Ако е така, мисля, че следното ще работи за вас:

CMPND <- function(X){
n <- length(X)
OUTPUT <- matrix(NA, nrow = n, ncol = n)
for (i in seq_len(n)){
OUTPUT[i, 1] = X[1] / 100
for (j in seq_len(i - 1) + 1) {
OUTPUT[i, j] = ((1 + OUTPUT[i, j - 1]) * (1 + X[j] / 100)) - 1
}
}
return(OUTPUT)
}

Използването на вашите данни е дълго, но дайте последователност от 5 10% възвръщаемост, получавате нещо като:

> CMPND(rep(.1, 5))
[,1]     [,2]        [,3]        [,4]       [,5]
[1,] 0.001       NA          NA          NA         NA
[2,] 0.001 0.002001          NA          NA         NA
[3,] 0.001 0.002001 0.003003001          NA         NA
[4,] 0.001 0.002001 0.003003001 0.004006004         NA
[5,] 0.001 0.002001 0.003003001 0.004006004 0.00501001

Можете да го направите по-ефективно, като използвате memoization, Сигурен съм.