问题描述
我正在研究一个问题集,但绝对无法解决。我想我已经把我的大脑炸到了已经不再有意义的地步。
这里是数据的查看...
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检验以比较分类变量每个级别之间一系列数字变量的差异
-
第三个参数 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的情况下完成……这就是为什么我在一开始遇到很多麻烦的原因。
解决方法
此解决方案的直觉是您可以循环遍历因变量,并在每个循环中调用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))
清除) )。