2015-04-03 101 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