Написание функции для сравнения различий ряда числовых переменных

#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 для выполнения следующей задачи:

  1. Выполните t-тесты с двумя выборками, чтобы сравнить различия ряда числовых переменных между каждым уровнем переменной классификации

  2. Первый аргумент, dat, является фреймом данных

  3. Второй аргумент, classVar, представляет собой символьный вектор длиной 1. Это имя переменной классификации, например, «пол».

  4. Третий аргумент, numVar, представляет собой символьный вектор, который содержит имя числовых переменных, таких как c(«age», «chol», «tg»). Это означает, что мне нужно выполнить три t-теста, чтобы сравнить разницу между мужчинами и женщинами.

  5. Функция должна возвращать фрейм данных со следующими переменными: 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)) помощью).