Telegram Group & Telegram Channel
Делаем t-тесты или u-тесты в R сразу для многих колонок с помощью `tidyverse`-подхода

Бывают ситуации, когда измерили много количественных переменных для двух групп, например контрольной и с заболеванием, я встречала такие данные у медиков или как результаты масс-спектрометрии. Планируется сравнить все эти количественные переменные тестом Стьюдента или Манна-Уитни, но вручную прописывать 3 или больше раз t-тест кажется не очень хорошей идеей. Что можно сделать? Будем использовать следующий подход: сначала развернем таблицу в длинный формат, соберем в списки значения по каждой группе и количественной переменной, затем таблицу снова превратим в широкий формат, но уже в виде
переменная1 [список значений контрольной группы] [список значений экспериментальной группы]

И уже к этой таблице применим нужный тест один раз и получим список p-value для каждой количественной переменной! Прикрепляю пример кода, постаралась прокомментировать основные моменты, данные сгенерированы из стандартного нормального распределения с заданием seed, так что этот код должен воспроизвестись:

 r
library(dplyr)
library(tidyr)
set.seed(2)
df <- data.frame(lapply(rep(100,15), rnorm),
group = rep(c('control', 'treatment'), each = 50)) # генерируем данные
colnames(df)[1:15] <- paste0('marker', 1:15) # меняем имена колонок на более понятные
df %>%
select(where(is.numeric), group) %>% # это на случай, если в исходном датафрейме не только числовые переменные
pivot_longer(cols = -group, names_to = 'variable') %>% # преобразуем датафрейм в long-формат
group_by(group, variable) %>% # группируем по типу обработки и типу переменных
summarise(value = list(value)) %>% # собираем в списки
pivot_wider(id_cols = c(variable), names_from = group) %>% # разворачиваем обратно
group_by(variable) %>% # группируем для проведения стат теста
# запускаем тест Манна-Уитни, сохраняем u-значение и p-value
mutate(p_value = wilcox.test(unlist(control), unlist(treatment))$p.value,
u_value = wilcox.test(unlist(control), unlist(treatment))$statistic)
#> `summarise()` has grouped output by 'group'. You can override using the
#> `.groups` argument.
#> # A tibble: 15 × 5
#> # Groups: variable [15]
#> variable control treatment p_value u_value
#> <chr> <list> <list> <dbl> <dbl>
#> 1 marker1 <dbl [50]> <dbl [50]> 0.293 1403
#> 2 marker10 <dbl [50]> <dbl [50]> 0.0403 1548
#> 3 marker11 <dbl [50]> <dbl [50]> 0.269 1411
#> 4 marker12 <dbl [50]> <dbl [50]> 0.997 1249
#> 5 marker13 <dbl [50]> <dbl [50]> 0.323 1106
#> 6 marker14 <dbl [50]> <dbl [50]> 0.560 1335
#> 7 marker15 <dbl [50]> <dbl [50]> 0.667 1313
#> 8 marker2 <dbl [50]> <dbl [50]> 0.117 1478
#> 9 marker3 <dbl [50]> <dbl [50]> 0.931 1263
#> 10 marker4 <dbl [50]> <dbl [50]> 0.866 1225
#> 11 marker5 <dbl [50]> <dbl [50]> 0.791 1211
#> 12 marker6 <dbl [50]> <dbl [50]> 0.986 1247
#> 13 marker7 <dbl [50]> <dbl [50]> 0.920 1235
#> 14 marker8 <dbl [50]> <dbl [50]> 0.0169 1597
#> 15 marker9 <dbl [50]> <dbl [50]> 0.707 1195

Если понадобится сделать не тест Манна-Уитни, как в примере, а t-test, то надо просто поменять в последней команде wilcox.test() на t.test().



group-telegram.com/stats_for_science/67
Create:
Last Update:

Делаем t-тесты или u-тесты в R сразу для многих колонок с помощью `tidyverse`-подхода

Бывают ситуации, когда измерили много количественных переменных для двух групп, например контрольной и с заболеванием, я встречала такие данные у медиков или как результаты масс-спектрометрии. Планируется сравнить все эти количественные переменные тестом Стьюдента или Манна-Уитни, но вручную прописывать 3 или больше раз t-тест кажется не очень хорошей идеей. Что можно сделать? Будем использовать следующий подход: сначала развернем таблицу в длинный формат, соберем в списки значения по каждой группе и количественной переменной, затем таблицу снова превратим в широкий формат, но уже в виде
переменная1 [список значений контрольной группы] [список значений экспериментальной группы]

И уже к этой таблице применим нужный тест один раз и получим список p-value для каждой количественной переменной! Прикрепляю пример кода, постаралась прокомментировать основные моменты, данные сгенерированы из стандартного нормального распределения с заданием seed, так что этот код должен воспроизвестись:

 r
library(dplyr)
library(tidyr)
set.seed(2)
df <- data.frame(lapply(rep(100,15), rnorm),
group = rep(c('control', 'treatment'), each = 50)) # генерируем данные
colnames(df)[1:15] <- paste0('marker', 1:15) # меняем имена колонок на более понятные
df %>%
select(where(is.numeric), group) %>% # это на случай, если в исходном датафрейме не только числовые переменные
pivot_longer(cols = -group, names_to = 'variable') %>% # преобразуем датафрейм в long-формат
group_by(group, variable) %>% # группируем по типу обработки и типу переменных
summarise(value = list(value)) %>% # собираем в списки
pivot_wider(id_cols = c(variable), names_from = group) %>% # разворачиваем обратно
group_by(variable) %>% # группируем для проведения стат теста
# запускаем тест Манна-Уитни, сохраняем u-значение и p-value
mutate(p_value = wilcox.test(unlist(control), unlist(treatment))$p.value,
u_value = wilcox.test(unlist(control), unlist(treatment))$statistic)
#> `summarise()` has grouped output by 'group'. You can override using the
#> `.groups` argument.
#> # A tibble: 15 × 5
#> # Groups: variable [15]
#> variable control treatment p_value u_value
#> <chr> <list> <list> <dbl> <dbl>
#> 1 marker1 <dbl [50]> <dbl [50]> 0.293 1403
#> 2 marker10 <dbl [50]> <dbl [50]> 0.0403 1548
#> 3 marker11 <dbl [50]> <dbl [50]> 0.269 1411
#> 4 marker12 <dbl [50]> <dbl [50]> 0.997 1249
#> 5 marker13 <dbl [50]> <dbl [50]> 0.323 1106
#> 6 marker14 <dbl [50]> <dbl [50]> 0.560 1335
#> 7 marker15 <dbl [50]> <dbl [50]> 0.667 1313
#> 8 marker2 <dbl [50]> <dbl [50]> 0.117 1478
#> 9 marker3 <dbl [50]> <dbl [50]> 0.931 1263
#> 10 marker4 <dbl [50]> <dbl [50]> 0.866 1225
#> 11 marker5 <dbl [50]> <dbl [50]> 0.791 1211
#> 12 marker6 <dbl [50]> <dbl [50]> 0.986 1247
#> 13 marker7 <dbl [50]> <dbl [50]> 0.920 1235
#> 14 marker8 <dbl [50]> <dbl [50]> 0.0169 1597
#> 15 marker9 <dbl [50]> <dbl [50]> 0.707 1195

Если понадобится сделать не тест Манна-Уитни, как в примере, а t-test, то надо просто поменять в последней команде wilcox.test() на t.test().

BY Статистика и R в науке и аналитике


Warning: Undefined variable $i in /var/www/group-telegram/post.php on line 260

Share with your friend now:
group-telegram.com/stats_for_science/67

View MORE
Open in Telegram


Telegram | DID YOU KNOW?

Date: |

Apparently upbeat developments in Russia's discussions with Ukraine helped at least temporarily send investors back into risk assets. Russian President Vladimir Putin said during a meeting with his Belarusian counterpart Alexander Lukashenko that there were "certain positive developments" occurring in the talks with Ukraine, according to a transcript of their meeting. Putin added that discussions were happening "almost on a daily basis." The Security Service of Ukraine said in a tweet that it was able to effectively target Russian convoys near Kyiv because of messages sent to an official Telegram bot account called "STOP Russian War." In December 2021, Sebi officials had conducted a search and seizure operation at the premises of certain persons carrying out similar manipulative activities through Telegram channels. The regulator took order for the search and seizure operation from Judge Purushottam B Jadhav, Sebi Special Judge / Additional Sessions Judge. Markets continued to grapple with the economic and corporate earnings implications relating to the Russia-Ukraine conflict. “We have a ton of uncertainty right now,” said Stephanie Link, chief investment strategist and portfolio manager at Hightower Advisors. “We’re dealing with a war, we’re dealing with inflation. We don’t know what it means to earnings.”
from es


Telegram Статистика и R в науке и аналитике
FROM American