Как запустить тест Chisq для нескольких строк быстрее в R?
Мне удалось выполнить chisq-test с использованием цикла в R, но он очень медленный для больших данных, и мне интересно, не могли бы вы помочь мне сделать это быстрее с чем-то вроде dplyr? Я пытался с dplyr, но я все время получал ошибку, которую я не уверен в причине.
Вот краткий пример моих данных:
df
1 2 3 4 5
row_1 2260.810 2136.360 3213.750 3574.750 2383.520
row_2 328.050 496.608 184.862 383.408 151.450
row_3 974.544 812.508 1422.010 1307.510 1442.970
row_4 2526.900 826.197 1486.000 2846.630 1486.000
row_5 2300.130 2499.390 1698.760 1690.640 2338.640
row_6 280.980 752.516 277.292 146.398 317.990
row_7 874.159 794.792 1033.330 2383.420 748.868
row_8 437.560 379.278 263.665 674.671 557.739
row_9 1357.350 1641.520 1397.130 1443.840 1092.010
row_10 1749.280 1752.250 3377.870 1534.470 2026.970
cs
1 1 1 2 1 2 2 1 2 3
Я хочу запустить chisq-test между каждой строкой df и cs. Затем дайте мне статистику и p.values, а также имена строк.
вот мой код для цикла:
value = matrix(nrow=ncol(df),ncol=3)
for (i in 1:ncol(df)) {
tst <- chisq.test(df[i,], cs)
value[i,1] <- tst$p.value
value[i,2] <- tst$statistic
value[i,3] <- rownames(df)[i]}
Спасибо за вашу помощь.
1 ответ
Я думаю, вы хотите сделать этот столбец за столбцом. Зная структуру Biobase::exprs(PANCAN_w))
очень помог бы Еще лучше было бы использовать пример из пакета Biobase вместо набора данных, который не может быть найден.
Это реализация кода, который я мог бы использовать. Примечание: вы НЕ хотите использовать матрицу для хранения результатов, если вы ожидаете сочетание числовых и символьных значений. Вы будете приводить все цифры к символу:
value = data.frame(p_val =NA, stat =NA, exprs = rownames(df) )
for (i in 1:col(df)) {
# tbl <- table((df[i,]), cs) ### No use seen for this
# I changed the indexing in the next line to compare columsn to the standard `cs`.
tst <- chisq.test(df[ ,i], cs) #chisq.test not vectorized, need some sort of loop
value[i, 1:2] <- tst[ c('p.value', 'statistic')] # one assignment per row
}
Очевидно, вам нужно будет изменить каждый экземпляр df
(не великое имя, так как есть также df
функция), чтобы Biobase::exprs(PANCAN_w)