我需要将R中的Mann Kendall趋势测试应用于大量(约100万)不同大小的时间序列。我已经创建了一个像这样的.txt文件:
1 2
1 4
1 5
2 4
2 55
3 2
3 4
3 5
3 4
3 55
...
第一列的每个数字都标识一个特定的时间序列。要获取我正在使用此代码的统计信息:
library(Kendall)
a=read.table("to_r.txt")
numData=1017135
for (i in 1:numData){
s1=subset(a,a$V1==i)
m=MannKendall(s1$V2)
cat(m[[1]]," ",m[[2]], " ", m[[3]]," ",m[[4]]," ", m[[5]], "\n" , file="monotonic_trend_checking.txt",append=TRUE)
}
这种方法有效,但问题是计算需要很长时间。时间序列最多800个元素(只有少数,另一个更短)所以我认为主要的瓶颈在循环中。 你能建议更快的方法吗?
答案 0 :(得分:4)
如果您认为循环是问题,我肯定会看看data.table。我最近写了一篇博文,比较了几种循环方式:
http://www.numbertheory.nl/2011/10/28/comparison-of-ave-ddply-and-data-table/
主要的信息是,当唯一身份证的数量(即您的时间序列数量)非常大时,data.table表现得非常好。
答案 1 :(得分:3)
这是一个非常简单的解决方案,可以将数据集拆分为多个部分,然后将MannKendall
应用于每个部分。
# example dataset
d <- data.frame(a=rnorm(1e6), b=rep(1:1000, each=1000))
mk <- lapply(split(d$a, d$b), MannKendall)
这在我的机器上大约需要十秒钟,这是一个运行Windows 7的中等强大的桌面。结果是一个列表;这是第一个组成部分:
> mk[[1]]
tau = 0.0319, 2-sided pvalue =0.13133
如果您想在数据框中全部使用:
mk <- do.call(rbind, mk)
答案 2 :(得分:1)
一个很大的问题是,您要将结果写入每个时间序列的文件中。文件访问需要时间。最好创建一个包含所有结果的大型数据表,然后在最后使用write.table()
一次。
当然,这假设您有足够的RAM来保存原始数据表和新结果表在内存中,这可能不是一个大问题。