任何人都能帮我加速一些代码:
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
以及mat
)执行回归分析(OLS),然后使用{{ 1}}来自adf.test
包的函数并存储tseries
。最终结果p-value
是所有sym.pr
的对称矩阵(但实际上它不是100%对称的,请参阅here for more info),但它就足够了。
使用上面的代码,在p-values
矩阵(600个观测值和300个物体)上,大约需要15分钟..
我想过可能只计算对称矩阵的上三角形,但不知道如何去做。
有什么想法吗?
感谢。
答案 0 :(得分:2)
从一些虚拟数据开始
mdf <- data.frame( x1 = rnorm(5), x2 = rnorm(5), x3 = rnorm(5) )
我首先会确定感兴趣的组合。因此,如果我理解正确,那么mdf[c(i,j)]
和mdf[c(j,i)]
的计算结果应该相同。在这种情况下,您可以使用combn
函数来确定相关对。
pairs <- as.data.frame( t( combn( colnames( mdf ),2 ) ) )
pairs
V1 V2
1 x1 x2
2 x1 x3
3 x2 x3
现在你可以在对上逐行应用你的函数(为简单起见,使用t.test):
pairs[["p.value"]] <- apply( pairs, 1, function( i ){
t.test( mdf[i] )[["p.value"]]
})
pairs
V1 V2 p.value
1 x1 x2 0.5943814
2 x1 x3 0.7833293
3 x2 x3 0.6760846
如果你仍然需要你的p.values回到(上三角形)矩阵形式,你可以投射它们:
library(reshape2)
acast( pairs, V1 ~ V2 )
x2 x3
x1 0.5943814 0.7833293
x2 NA 0.6760846