我正在尝试将极值理论的块最大值(在我的案例中最小值)方法应用于财务回报。我有一个存储在名为'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列。
答案 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)