提取最小值返回

时间:2015-04-03 15:31:29

标签: r dataframe block maxima

我正在尝试将极值理论的块最大值(在我的案例中最小值)方法应用于财务回报。我有一个存储在名为'Returns'的csv文件中的30个财务索引的每日报表。我首先加载数据

Returns<-read.csv("Returns.csv", header=TRUE)               
然后,我在我的'Returns.csv'文件中为每个索引提取相等长度(即5天)的连续非重叠块的最小回报。为此,我做了以下

    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返回值存储在文件'minima.csv'的第二列中,依此类推,直到我到达第30列。

1 个答案:

答案 0 :(得分: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

基本上,apply是按列拆分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)