编写函数以比较一系列数值变量的差异

问题描述

我正在研究一个问题集,但绝对无法解决。我想我已经把我的大脑炸到了已经不再有意义的地步。

这里是数据的查看...

   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的字符向量。它是分类变量名称,例如'sex'。

  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的情况下完成……这就是为什么我在一开始遇到很多麻烦的原因。

解决方法

此解决方案的直觉是您可以循环遍历因变量,并在每个循环中调用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))清除) )。