R中具有多个mu值的多列的单样本T检验

Posted

技术标签:

【中文标题】R中具有多个mu值的多列的单样本T检验【英文标题】:One-sample T-test Over Multiple Columns with Multiple mu Values in R 【发布时间】:2022-01-09 03:21:44 【问题描述】:

我有几个数据集,每个数据集都针对一个特定的时间点,每个数据集都包含多个度量值。对于它们中的每一个,我想对每个度量进行一个样本 t 检验,因此跨越所有列。每个度量都有一个不同的 mu 值,我想将结果与之进行比较。我已经尝试创建一个函数来执行此操作,因此我只需将数据集的名称作为参数给它。我创建了一个 mu 值列表。但是,该函数不接受这个,我得到一个错误。 这是一个示例数据集:

t1 <- rnorm(20, 10, 1)
t2 <- rnorm(20, 10, 1)
t3 <- rnorm(20, 10, 1)
test_data <- data.frame(t1, t2, t3)

还有 mu 值和变量的列表:

muvals <- c(24, 51.8, 21.89)
varlist <- c(t1, t2, t3)

这是我对该功能的尝试:

onett <- function(tpoint) 
  t.test(tpoint$varlist, mu = muvals)

我得到的错误信息是: t.test.default(tpoint$varlist, mu = muvals) 中的错误: 'mu' 必须是单个数字

有没有办法让这个函数工作,或者以其他方式遍历每一列和 mu 值列表?

编辑:每个 mu 值仅适用于一列。所以第一列的第一个值等等。

【问题讨论】:

在 R 中有几种很好的循环方式,有些比其他的更整洁!可以准备一个答案,但知道你正在寻找什么样的输出会很有帮助。你想让它打印所有(九个)t检验结果吗?或者将输出存储在某处? 是的,如果我可以存储测试的值会很有帮助 【参考方案1】:

要遍历每列和 mu 值的每个组合并简单地打印出所有 t 测试的结果,purrr::cross2 函数将为您提供所有列/mu 组合的列表,purrr::map 将循环测试:

library(purrr)

t1 <- rnorm(20, 10, 1)
t2 <- rnorm(20, 10, 1)
t3 <- rnorm(20, 10, 1)
test_data <- data.frame(t1, t2, t3)

onett <- function(data) 
  muvals <- c(24, 51.8, 21.89)
  map(cross2(data, muvals), ~ t.test(.x[[1]], mu = .x[[2]]))


onett(test_data)
#> Prints t-test results...

编辑#1

从您对问题的澄清来看,map2 似乎会同时迭代两个相同长度的对象。要创建一个将数据传递给的函数,我建议如下:

library(purrr)
library(dplyr)
library(tidyr)

t1 <- rnorm(20, 10, 1)
t2 <- rnorm(20, 10, 1)
t3 <- rnorm(20, 10, 1)
test_data <- data.frame(t1, t2, t3)


# (Can work best to have `muvals` defined in function rather than environment)

onett <- function(data, muvals = c(24, 51.8, 21.89)) 
  map2(data, muvals, function(data, mu) t.test(data, mu = mu))


onett(test_data) %>% 
  map_dfr(broom::tidy)

#> # A tibble: 3 x 8
#>   estimate statistic  p.value parameter conf.low conf.high method    alternative
#>      <dbl>     <dbl>    <dbl>     <dbl>    <dbl>     <dbl> <chr>     <chr>      
#> 1    10.1      -50.4 1.07e-21        19     9.50      10.7 One Samp~ two.sided  
#> 2    10.3     -187.  1.65e-32        19     9.83      10.8 One Samp~ two.sided  
#> 3     9.99     -47.8 2.87e-21        19     9.47      10.5 One Samp~ two.sided

函数输出t检验结果列表。您可以使用broom::tidy 提取所有 t 统计量、p 值等(如上所示),或将其合并到函数中,或整理函数中的输出以提供所需的内容。

由reprex package (v2.0.1) 于 2021-12-04 创建

【讨论】:

您好。对不起,我不清楚。每个 mu 值仅适用于一列。所以列表中的第一个值用于第一列,第二个值用于第二列,等等。如果不使用 cross2,这是否可行?还是我需要使用 map2? 嗨@miku - 对不起,我以为你第一次要找的东西,我以为我弄错了。您可以很容易地为此使用map2 - 将更新我的解决方案。 这太棒了@Andrew Baxter。太感谢了。你能解释一下为什么在函数中定义 muval 比在环境中定义更好吗? 很高兴它有帮助:)。基本上,如果在函数参数中定义(如上),那么您可以确保它每次都以相同的方式运行。如果它在环境中查找muvals,那么a)您需要确保首先运行该行并且b)如果muvals以某种方式发生更改,那么该函数下次运行方式不同(因为它再次查找muvals -请参阅adv-r.hadley.nz/functions.html#lexical-scoping 以获取有用的概要)。您可以将定义放入函数中,但将其放入要传递给函数的参数列表中,您可以在需要时将新值传递给同一函数。【参考方案2】:

可能有更短的方法,但这里建议使用所有 mu 值测试所有样本:将 p 值存储到数据帧中。

您会在下面找到一个函数,您可以在其中指定样本和 mu 值;那么你可以创建一个数据框来存储 p 值。

# 1- Simulating samples into a data-frame
set.seed(1)
for(k in 1:3) 
  assign(paste("t", k, sep=""), rnorm(20, 10, 1)) 

test_data <- data.frame(t1, t2, t3)

# 2- Choosing mu values to test
muvals <- c(24, 51.8, 21.89)

# 3- Creating function which depends on both your sample and your mu value
onett <- function(tPoint, muValue) 
  t.test(tPoint, mu=muValue)$p.value


# 4- Creating a data-frame for p-values storage with your mu values as row-names and your sample name as column-name
dfPvalues <- data.frame(matrix(NA, length(muvals), ncol(test_data)), row.names=muvals)
colnames(dfPvalues) <- colnames(test_data)

# 5- Filling the p-value data-frame through a loop
for(i in 1:nrow(dfPvalues))
  for(j in 1:ncol(dfPvalues))
    dfPvalues[i, j] <- onett(tPoint=test_data[,j], muValue=muvals[i])
  

【讨论】:

以上是关于R中具有多个mu值的多列的单样本T检验的主要内容,如果未能解决你的问题,请参考以下文章

f检验的p值和r值是啥意思?

R语言使用pwr包的pwr.t.test函数对分组样本数相同的t检验进行效用分析(power analysis)在已知效应量(effect size)显著性水平效用值的情况下计算需要的样本量

ABtest显著性校验(配对T检验)

R配对样本t检验(PAIRED T-TEST​​​​​​​)

python 数据分析不同情况下的t检验Wilcoxon符号秩检验Wilcoxon秩和检验卡方检验Fisher检验

python 数据分析不同情况下的t检验Wilcoxon符号秩检验Wilcoxon秩和检验卡方检验Fisher检验