私は、zoo/xtsのrollapply
などの機能に似ていますが、私のニーズに適用できるコードを生成しようとしています。私はいくつかの非常に簡単なサンプルデータを使ってコードを作りました。しかし、今私はedhec
データで実行しようとしていますが、エラーが発生しています。なぜ私は不明ですが、それがifステートメントと関係があると仮定します。誰がエラーを受け取っているのかを診断できる人はいますか?ステートメントエラー/ステートメントが適用されない場合
#rm(list=ls()) #Clear environment
cat("\014") #CTRL + L
library(xts)
library(lubridate)
is.even <- function(x) x %% 2 == 0
roundUp <- function(x,to=2)
{
to*(x%/%to + as.logical(x%%to))
}
functionTest <- function(data, window, slide){
nyears_t = nyears(data)
#IF statement for non-even numbers only
if(is.even(nyears_t == FALSE)) {
nyears_t <- roundUp(nyears_t)
data_extend <- data
start_extend <- .indexyear(data)[length(data)]+ 1900 + 1
end_extend <- start_extend + length(data) - 1
index(data_extend) <- update(index(data),year=start_extend:end_extend)
data <- rbind(data, data_extend)
warning("WARNING! The function has looped to the start of the timeseries. The final list(s)
will contain years that do not exist in the dataset. Please modify.")
}
nslides = nyears_t/slide
#Matrix
year_1 = (.indexyear(data)[1]+1900)
start <- seq(from = year_1, by = slide, length.out = nslides)
end <- start + window - 1
mat <- matrix(c(start, end), ncol = 2, dimnames = list(c(1:nslides), c("start", "end")))
#For loop
subsetlist <- vector('list')
for(i in 1:nslides){
subset <- data[paste0(mat[i,1], "/", mat[i,2])]
subsetlist[[i]] <- subset
}
print(subsetlist)
}
Iは、上記機能を行う時に使用したサンプルコード:
a <- seq(from = as.POSIXct("2000", format = "%Y"), to = as.POSIXct("2008", format = "%Y"), by = "year")
a <- as.xts(1:length(a), order.by = a)
a
functionTest(data = a, window = 3, slide = 2)
私がテストとエラーを受信していますサンプルコード:
> data(edhec, package = "PerformanceAnalytics")
> edhec <- edhec[,1:3]
> edhec <- edhec["/2007"]
> head(edhec)
Convertible Arbitrage CTA Global Distressed Securities
1997-01-31 0.0119 0.0393 0.0178
1997-02-28 0..0298 0.0122
1997-03-31 0.0078 -0.0021 -0.0012
1997-04-30 0.0086 -0.0170 0.0030
1997-05-31 0.0156 -0.0015 0.0233
1997-06-30 0.0212 0.0085 0.0217
> functionTest(data = edhec, window = 3, slide = 2)
Show Traceback
Rerun with Debug
Error in start_extend:end_extend : NA/NaN argument
>
UPDATE:
コードが次のアップデートで実行されるようになりましたifステートメント(Joshua Ulrichのおかげで)(下記のコードを参照)。しかし、if文にはまだ問題があります。データセットに偶数年または奇数年があるかどうかにかかわらず実行されるように見えます。これは関数の精度には影響しませんが、大きなデータセットを考慮すると問題になることがあります。もし誰かがこれに関する考えを持っていれば、それは大いに感謝されるでしょう。さもなければこれは既に超大です! (XTS /動物園オブジェクトのcoredata
が何であるかである)マトリックス上length
を呼び出す歓声
if(is.even(nyears_t == FALSE)) {
nyears_t <- roundUp(nyears_t)
data_extend <- data
start_extend <- .indexyear(data)[nrow(data)] + 1900 + 1
end_extend <- start_extend + nyears(data) - 1
dates <- index(data)
tmp <- as.POSIXlt(dates)
tmp$year <- tmp$year + nyears(data)
dates2 <- as.POSIXct(tmp, tz = tz)
index(data_extend) <- dates2
data <- rbind(data, data_extend)
warning("WARNING! The function has looped to the start of the timeseries. The final list(s)
will contain years that do not exist in the dataset. Please modify.")
}
ありがとうございました@ジョシュア、私はこのエラーを自分で見つけました。私はこの機能を使いこなしていました。また、コードを正しく実行するためには、いくつかの変更が必要であることに気付きました(質問に追加しました)。 これで、意図したとおりにコードが実行されているようです。しかし、まだまだ小さな悩みがあります。 if文が常に実行中のようです...私はedhecを奇数と偶数に変更し、if文は常に適用されます。これは、if文の中に根本的に何かが間違っていることを示唆しています。 – Visser
@ Visser:あなたのアップデートに関しては、あなたは 'if(!is。偶数(nyears_t)) 'である。 –