2016-12-04 26 views
2

我在想方設法將財務時間序列轉換爲象徵性的時間序列,該序列根據給定順序解釋所有「有意義」的排列組合(在R):如何根據排列順序識別時間序列的所有可能排列

實施例:

給定一個時間序列:ts= c(1,2,3,4,5)

如果Order = 2我想提取以下模式:
1)1 1 (ts[i]==ts[i+1])
2)12 (ts[i]<ts[i+1])
3)2 1 (ts[i]>ts[i+1])

(因爲平等經由模式1 1)佔圖案2 2是冗餘

如果Order = 3我想提取以下模式:
1) 1 2 3 (ts[i]<ts[i+1]<ts[i+2])
2)1 2 2 (ts[i]<ts[i+1]==ts[i+2])
3)1 2 1 (ts[i]<ts[i+1]>ts[i+2])
4)2 2 3 (ts[i]==ts[i+1]<ts[i+2])
5)2 2 2 (ts[i]==ts[i+1]==ts[i+2])
6)2 2 1 (ts[i]==ts[i+1]>ts[i+2])
7)3 2 1 (ts[i]>ts[i+1]>ts[i+2])
8)3 2 2 (ts[i]>ts[i+1]==ts[i+2])
9)3 2 3 (ts[i]>ts[i+1]<ts[i+2])

我所尋找的是一個可擴展的(爲了計是2,3,4,5等)和自動化(功能)的方式來做到這一點。

我正在努力使用諸如「permute」,「gtools」,「combinat」等軟件包,但無濟於事。我認爲我所尋求的是排列的特例。任何人都可以幫我解決這個問題嗎?

我的任務從閱讀關於「排列熵」的論文開始,谷歌學者搜索將爲您提供相關書目供任何感興趣的人蔘考。

回答

1

試試這個:

library(zoo) 
ts <- c(1,3,2,4,5,4,3,3,2) 
rollapply(ts, 2, rank, ties='min') 

    [,1] [,2] 
[1,] 1 2 
[2,] 2 1 
[3,] 1 2 
[4,] 1 2 
[5,] 2 1 
[6,] 2 1 
[7,] 1 1 
[8,] 2 1 

當順序= 3:

rollapply(ts, 3, rank, ties='min') 

    [,1] [,2] [,3] 
[1,] 1 3 2 
[2,] 2 1 3 
[3,] 1 2 3 
[4,] 1 3 1 
[5,] 3 2 1 
[6,] 3 1 1 
[7,] 2 2 1 

不是你想要相當多什麼,但它接近。主要問題在前兩行中可以看出,當兩者都高於或低於中間觀察值時,您不希望區分第一和第三值的等級。這是一個修復。

z <- rollapply(ts, 3, rank, ties='min') 
lohilo <- z[,1] < z[,2] & z[,3] < z[,2] 
hilohi <- z[,1] > z[,2] & z[,3] > z[,2] 
z[lohilo,] <- rep(c(1,2,1),rep(sum(lohilo),3)) 
z[hilohi,] <- rep(c(2,1,2),rep(sum(hilohi),3)) 
z 
    [,1] [,2] [,3] 
[1,] 1 2 1 
[2,] 2 1 2 
[3,] 1 2 3 
[4,] 1 2 1 
[5,] 3 2 1 
[6,] 3 1 1 
[7,] 2 2 1