2015-04-03 65 views
0

我試圖將極值理論的塊最大值(在我的情況下爲最小值)方法應用於財務報告。我每天有30個財務指數存儲在一個名爲'Returns'的csv文件中。我通過加載數據提取最小值返回

Returns<-read.csv("Returns.csv", header=TRUE)    

然後我提取在等於長度(即,5天)對每個索引我在我的「Returns.csv」文件的連續的不重疊的塊的最小返回開始。爲此,我做了以下

for (xx in Returns)        #Obtain the minima. 
    { 
    rows<-length(xx)        #This is the number of returns 
    m<-5           #When m<-5 we obtain weekly minima. Change accordingly (e.g., 20) 
    k<-rows/m          #This is the number of blocks (i.e., number of returns/size of block), 
    bm<-rep(0,k)         #which is also the number of extremes 
    for(i in 1:k){bm[i]<-min(xx[((i-1)*m+1):(i*m)])} 
             #Store the minima in a file 'minima.csv' 
    write.table(bm,file="minima.csv", append=TRUE, row.names=FALSE, col.names=FALSE) 

代碼提取所有指數最小值返回正確的,但是當最小值存儲在文件「minima.csv」他們都出現在同一列(附加)。 我想要的代碼是讀取文件'Returns.csv'的第一列中包含的財務回報,提取連續的非重疊的等長(即5天)塊的最小回報並將它們存儲在文件'minima.csv'的第一列中。然後對文件'Returns.csv'的第二列中包含的財務回報執行完全相同的操作,並將最小值返回存儲在文件'minima.csv'的第二列中,依此類推,直到達到第30列。

+2

請將您'Returns'數據('到你的問題複製和粘貼dput的'輸出(返回))的樣品。 – nrussell 2015-04-03 15:33:53

+0

感謝您及時回覆nrussell。我有成千上萬的數據點。我不確定這是不是你的意思,但這裏是: – Kostas 2015-04-03 19:59:13

+0

我在我的問題中添加了一個小樣本。對不起,如果這不是你的意思。我本來可以上傳文件的方式。非常感謝 – Kostas 2015-04-03 20:08:56

回答

1

我覺得你的數據看起來與此類似:

> m <- matrix(1:40, ncol=4) 
> m 
     [,1] [,2] [,3] [,4] 
[1,] 1 11 21 31 
[2,] 2 12 22 32 
[3,] 3 13 23 33 
[4,] 4 14 24 34 
[5,] 5 15 25 35 
[6,] 6 16 26 36 
[7,] 7 17 27 37 
[8,] 8 18 28 38 
[9,] 9 19 29 39 
[10,] 10 20 30 40 

很明顯,你有更多的行和列數據不只是1到40的順序要與塊的尺寸爲5每一列找到每列運行的最小值:

> apply(m, 2, function(x) sapply(split(x, ceiling(seq_along(x)/5)), min)) 
    [,1] [,2] [,3] [,4] 
1 1 11 21 31 
2 6 16 26 36 

基本上應用按列拆分m並將函數應用於每列。內部函數獲取每列,組合列,然後返回每個塊的最小值。您的數據不是矩陣,因此您需要在運行上述命令之前執行此操作。

m <- as.matrix(Returns) 

爲了寫這爲csv

> mins <- apply(m, 2, function(x) sapply(split(x, ceiling(seq_along(x)/5)), min)) 
> write.table(mins, file="test.min.csv", sep=',', row.names=F, col.names=F, quote=F) 
+0

現在工作正常。我用write.table(mins,file =「test.min.csv」,row.names = FALSE,col.names = FALSE)來存儲輸出。是否在你的命令中加入了sep =','來完成這項工作?第一次我發佈了一個問題,不得不說我對快速反應和幫助意願印象深刻。非常感謝你的幫助jwilley44。 – Kostas 2015-04-04 05:51:58