5

R で無限再帰を処理する方法についてのアドバイスが見つかりません。他の人が恩恵を受けることができるように、最も一般的な方法で問題を説明したいと思います。自由に編集してください。

以前は double for ループを実行していました

for (k in 1:n){ for (i in 1:m){
f[i,,k] <- an expression that depends on g[i-1,,k]
g[i,,k] <- a mixture of g[i-1,,k] and f[i,,k]}}

これは問題なく実行されていましたが、私の基準に最も適した k を見つけたいと思っていました。そこで、後で最適化またはルート解除できるように、関数に変換することにしました。私はそのようなものを書きました:

f <- function(i,k){an expression that depends on g(i-1,k)}
g <- function(i,k){an expression that depends on g(i-1,k) and f(i,k)}

2 つの問題は似ていると思っていましたが、驚いたことに、無限再帰エラーが発生しました。

最大メモリについて読みましたが、もっと審美的な方法があると確信しています。

私の再現可能な例:

library(memoise)

gradient <- function(x,y,tau){if (x-y > 0) {- tau} else {(1-tau)}}
aj <- c(-3,-4,-2,-3,-5,-6,-4,-5,-1,rep(-1,15))
f <- function(x,vec){sum(x^vec)-1}
root <- uniroot(f, interval=c(0,200), vec=aj)$root

memloss<-function(i,k){if (i==1) {c(rep(0,24))} else if (i <= 0 | k < -5) {0} else {gradient(dailyreturn[i-1],weight(i-1,k)%*%A[i-1,],0.0025)*A[i-1,]}}
memweight <- function(i,k){if (i==1) {c(rep(root,24)^aj)} else if (i <= 0 | k < -5) {0} else {(exp(- (2^(k)/(sqrt(1415))) * loss(i,k))) / (weight(i-1,k) %*%  exp(- 2^(k)/(sqrt(1415)) * loss(i,k)) ) * weight(i-1,k)}}
loss <- memoize(memloss)
weight <- memoize(memweight)

ここで、dailyreturn はベクトル (長さ 2080) です

A は 1414 x 24 の行列です

それが役立つことを願っています。

4

1 に答える 1