Как использовать пакет bigstatsr R с двумя наборами данных для оценки параметров?
У меня есть независимые и зависимые наборы данных. Я хочу проверить все возможные отношения между зависимыми и независимыми переменными. В моем предыдущем посте (Как реплицировать функцию с помощью mapply с несколькими аргументами для расчета мощности метода? ) Я хотел провести анализ мощности с использованием данных моделирования. Теперь я хочу проанализировать реальные данные, используя ту же функцию. Проблема в том, что test_function потребовалось больше времени, поскольку мой набор данных большой (размер каждого набора данных превышает 10000 X 40000). Кроме того, я хочу использовать параллельные вычисления для ускорения вычислений. Я обнаружил, что пакет bigstatsr ( https://privefl.github.io/bigstatsr/index.html) может обрабатывать матрицы, слишком большие для размещения в памяти. Более того, я хочу избежатьexpand.grid, поскольку он требует больших вычислительных ресурсов для обработки больших данных. Я не нашел ни одной публикации, в которой можно было бы использовать два набора данных одновременно с использованием пакета bigstatsr и параллельно оценивать параметры. Примеры наборов данных и код приведены ниже:
# dependent dataset
test_A <- data.frame(matrix(rnorm(100), nr=10, nc=10))
# independent dataset
test_B <- data.frame(matrix(sample(c(0,1,2), 500, replace = TRUE), nr=50, nc=10))
# Find all combination using dependent and independe datasets's variables
A_B_pair <- subset(expand.grid(c1=names(test_A), c2=names(test_B),
stringsAsFactors = FALSE))
# Main function to estimate the parameter and p-values
test_function <- function(test_A, test_B, x,y){
c1 <- test_A [[x]]
c2 <- test_B[[y]]
Data <- data.frame(1, XX=c1, YY=c2)
model_lm <- lm(YY ~ XX, Data)
est_lm <- as.numeric(model_lm$coefficients)[2]
pvalue_lm <- as.numeric(summary(model_lm)$coeffi[,4][2])
return(unlist(data.frame(lm.estimator = est_lm, lm.pvalue =pvalue_lm)))
}
# Final output
output <- mapply(test_function, MoreArgs = list(test_A, test_B),
x = A_B_pair$c1, y = A_B_pair$c2)
Как я могу применить bigstatsr и параллельно вычислить эту функцию для получения выходных данных? Большое вам спасибо за ваши усилия и помощь.
1 ответ
Я не думаю, что здесь действительно проблема размера (в плане памяти), а просто проблема времени вычислений.
Я думаю, вы просто хотите провести однофакторное тестирование. Для этого вы можете использовать функцию
big_univLinReg
:
library(bigstatsr)
X <- as_FBM(test_B)
NCORES <- nb_cores()
k <- 1 ## replace by loop here
stats <- big_univLinReg(X, test_A[[k]], ncores = NCORES)
pval <- predict(stats, log10 = FALSE)
Эта функция должна быть довольно быстрой и давать вам все коэффициенты для всех переменных в
test_B
. Затем вам нужно только перебрать переменные в
test_A
.