nc <- 205
nr <- 15000
set.seed(30)
EC <- matrix(rnorm(nr * nc), nr, nc)
CP <- matrix(rnorm(nr * nc), nr, nc)
計算行手段とVARS(これはループにこの操作を置くために、あなたの最大の過ちだった):
事前に計算された行手段と行VARSを使用して
meansEC <- rowMeans(EC)
meansCP <- rowMeans(CP)
require(matrixStats)
varsEC <- rowVars(EC)
varsCP <- rowVars(CP)
我々は、pを計算することができます。 t.test機能せずずっと速い値(あなたが必要な部分を抽出するためにt.test
コードを見ることができます):
t.test.p.value <- function(i, j, nx, ny){
mu <- 0
mx <- meansEC[i]
vx <- varsEC[i]
my <- meansCP[j]
vy <- varsCP[j]
df <- nx + ny - 2
v <- 0
if (nx > 1) v <- v + (nx - 1)*vx
if (ny > 1) v <- v + (ny - 1)*vy
v <- v/df
stderr <- sqrt(v*(1/nx + 1/ny))
tstat <- (mx - my - mu)/stderr
pval <- 2 * pt(-abs(tstat), df)
pval
}
# create resulting matrix
ttest_result <- matrix(NA, nrow(EC), 7)
t <- Sys.time()
nx <- ncol(EC)
ny <- ncol(CP)
は試合t.test.p.value機能とデフォルトので計算することができます:
for (i in 1:nrow(EC)) {
ttest_result[i, 2] <- meansEC[i]
ttest_result[i, 3] <- meansCP[i]
ttest_result[i, 4] <- (meansEC[i] - meansCP[i])
ttest_result[i, 5] <- (meansEC[i]/meansCP[i])
ttest_result[i, 6] <- t.test(EC[i, ], CP[i, ], var.equal = TRUE)$p.value
ttest_result[i, 7] <- t.test.p.value(i, i, nx, ny)
}
t <- Sys.time() - t
t
ttest_result[1:5, 5:7]
# [,1] [,2] [,3]
# [1,] -0.3248217 0.35084307 0.35084307
# [2,] -2.3455622 0.11621785 0.11621785
# [3,] -2.1586716 0.01294876 0.01294876
# [4,] 1.1556035 0.98065576 0.98065576
# [5,] 1.9875296 0.92340948 0.92340948
all.equal(ttest_result[,6], ttest_result[, 7])
# [1] TRUE
私たちは、結果は私のアプローチを使用して、このデータの
タイミング等しいことを参照してください。行列に変換し、すべての列が数値であれば
t <- Sys.time()
meansEC <- rowMeans(EC)
meansCP <- rowMeans(CP)
require(matrixStats)
varsEC <- rowVars(EC)
varsCP <- rowVars(CP)
ttest_result <- matrix(NA, nrow(EC), 7)
for (i in 1:nrow(EC)) {
ttest_result[i, 2] <- meansEC[i]
ttest_result[i, 3] <- meansCP[i]
ttest_result[i, 4] <- (meansEC[i] - meansCP[i])
ttest_result[i, 5] <- (meansEC[i]/meansCP[i])
ttest_result[i, 6] <- t.test.p.value(i, i, nx, ny)
}
t <- Sys.time() - t
t #Time difference of 0.145169 secs
。 data.frameの行操作は非常に遅いです。行列を転置して、行ではなく列で操作すると、少しでも良くなります。 – lmo