#r #function #t-test
#r #функция #t-тест
Вопрос:
Я работаю над набором проблем и абсолютно не могу разобраться в этом. Я думаю, что я поджарил свой мозг до такой степени, что это даже больше не имеет смысла.
Вот посмотрите на данные …
sex age chol tg ht wt sbp dbp vldl hdl ldl bmi
<chr> <int> <int> <int> <dbl> <dbl> <int> <int> <int> <int> <int> <dbl>
1 M 60 137 50 68.2 112. 110 70 10 53 74 2.40
2 M 26 154 202 82.8 185. 88 64 34 31 92 2.70
3 M 33 198 108 64.2 147 120 80 22 34 132 3.56
4 F 27 154 47 63.2 129 110 76 9 57 88 3.22
5 M 36 212 79 67.5 176. 130 100 16 37 159 3.87
6 F 31 197 90 64.5 121 122 78 18 58 111 2.91
7 M 28 178 163 66.5 167 118 68 19 30 135 3.78
8 F 28 146 60 63 105. 120 80 12 46 88 2.64
9 F 25 231 165 64 126 130 72 23 70 137 3.08
10 M 22 163 30 68.8 173 112 70 6 50 107 3.66
# … with 182 more rows
Я должен написать функцию myTtest для выполнения следующей задачи:
-
Выполните t-тесты с двумя выборками, чтобы сравнить различия ряда числовых переменных между каждым уровнем переменной классификации
-
Первый аргумент, dat, является фреймом данных
-
Второй аргумент, classVar, представляет собой символьный вектор длиной 1. Это имя переменной классификации, например, «пол».
-
Третий аргумент, numVar, представляет собой символьный вектор, который содержит имя числовых переменных, таких как c(«age», «chol», «tg»). Это означает, что мне нужно выполнить три t-теста, чтобы сравнить разницу между мужчинами и женщинами.
-
Функция должна возвращать фрейм данных со следующими переменными: Varname, F.mean, M.mean, t (для t-статистики), df (для степеней свободы) и p (для p-значения).
Я должен быть в состоянии запустить это…
myTtest(dat = chol, classVar = "sex", numVar = c("age", "chol", "tg")
… и затем отобразите фрейм данных.
Любая помощь приветствуется. Я рву на себе волосы из-за этого! Кроме того, как отмечено в моем комментарии ниже, это должно быть сделано без Tidyverse … вот почему у меня так много проблем с самого начала.
Комментарии:
1. разрешены ли функции tidyverse?
2. К сожалению, нет. Вот почему у меня так много проблем с этим. Ха-ха.
Ответ №1:
Интуиция для этого решения заключается в том, что вы можете перебирать свои зависимые переменные и вызывать t.test()
в каждом цикле. Затем сохраните результаты каждого DV и объедините их в один большой фрейм данных.
Я оставлю некоторые биты для вас, чтобы заполнить, но вот суть:
Во-первых, некоторые примеры данных:
set.seed(123)
n <- 20
grp <- sample(c("m", "f"), n, replace = TRUE)
df <- data.frame(grp = grp, age = rnorm(n), chol = rnorm(n), tg = rnorm(n))
df
grp age chol tg
1 m 1.2240818 0.42646422 0.25331851
2 m 0.3598138 -0.29507148 -0.02854676
3 m 0.4007715 0.89512566 -0.04287046
4 f 0.1106827 0.87813349 1.36860228
5 m -0.5558411 0.82158108 -0.22577099
6 f 1.7869131 0.68864025 1.51647060
7 f 0.4978505 0.55391765 -1.54875280
8 f -1.9666172 -0.06191171 0.58461375
9 m 0.7013559 -0.30596266 0.12385424
10 m -0.4727914 -0.38047100 0.21594157
Теперь создайте контейнер, в который будут помещаться все выходные данные модели:
fits_df <- data.frame()
Перебирайте каждый DV и добавляйте выходные данные модели к fits_df
каждому времени с помощью rbind
:
for (dv in c("age", "chol", "tg")) {
frml <- as.formula(paste0(dv, " ~ grp")) # make a model formula: dv ~ grp
fit <- t.test(frml, two.sided = TRUE, data = df) # perform the t-test
# hint: use str(fit) to figure out how to pull out each value you care about
fit_df <- data.frame(
dv = col,
f_mean = xxx,
m_mean = xxx,
t = xxx,
df = xxx,
p = xxx
)
fits_df <- rbind(fits_df, fit_df)
}
Ваш вывод будет выглядеть следующим образом:
fits_df
dv f_mean m_mean t df p
1 age -0.18558068 -0.04446755 -0.297 15.679 0.7704954
2 chol 0.07731514 0.22158672 -0.375 17.828 0.7119400
3 tg 0.09349567 0.23693052 -0.345 14.284 0.7352112
Одно замечание: когда вы извлекаете значения из fit
, вы можете получить нечетные имена строк в вашем фрейме выходных данных. Это связано со names
свойством различных fit
атрибутов. Вы можете избавиться от них, используя as.numeric()
или as.character()
обертки вокруг значений, которые вы извлекаете из fit
(например, fit$statistic
можно очистить с as.character(round(fit$statistic, 3))
помощью).