任何人都可以帮助我加快一些代码:
n = seq_len(ncol(mat)) # seq 1 to ncol(mat)
sym.pr<-outer(n,n,Vectorize(function(a,b) {
return(adf.test(LinReg(mat[,c(a,b)]),k=0,alternative="stationary")$p.value)
}))
哪里mat
是观察和对象的NxM
矩阵,例如:N
M
Obj1 Obj2 Obj3
1 . . .
2 . . .
3 . . .
LinReg
定义为:
# Performs linear regression via OLS
LinReg=function(vals) {
# regression analysis
# force intercept c at y=0
regline<-lm(vals[,1]~as.matrix(vals[,2:ncol(vals)])+0)
# return spread (residuals)
return(as.matrix(regline$residuals))
}
基本上,我正在对 中的每个对象组合(即Obj1, Obj2
和Obj2,Obj3
和Obj1, Obj3
)执行回归分析(OLS) mat
,然后使用包中的adf.test
函数tseries
并存储p-value
. 最终结果sym.pr
是所有的对称矩阵p-values
(但实际上它不是 100% 对称的,请参阅此处了解更多信息),但它就足够了。
使用上面的代码,在一个600x300
矩阵(600 个观察和 300 个对象)上,大约需要 15 分钟。
我想可能只计算对称矩阵的上三角形,但不知道如何去做。
有任何想法吗?
谢谢。