Как запустить тест Chisq для нескольких строк быстрее в R? - PullRequest
0 голосов
/ 29 сентября 2018

Мне удалось выполнить 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 Ответ

0 голосов
/ 29 сентября 2018

Полагаю, вы хотите сделать этот столбец за столбцом.Знание структуры 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)

...