簡體   English   中英

R加速矢量化為方陣

[英]R Speed up vectorize for square matrix

有人能幫我加速一些代碼:

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)
}))

matN觀察的NxM矩陣和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))
}

基本上我在mat每個對象組合(即Obj1, Obj2Obj2,Obj3Obj1, Obj3 )上執行回歸分析(OLS),然后使用tseries包中的adf.test函數並存儲p-value 最終結果sym.pr是所有p-values的對稱矩陣(但實際上它並非100%對稱,請參閱此處以獲取更多信息 ),但它就足夠了。

使用上面的代碼,在600x300矩陣(600個觀測值和300個物體)上,大約需要15分鍾。

我想過可能只計算對稱矩陣的上三角形,但不知道如何去做。

有任何想法嗎?

謝謝。

從一些虛擬數據開始

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM