R 中具有多个 mu 值的多列单样本 T 检验
One-sample T-test Over Multiple Columns with Multiple mu Values in R
我有几个数据集,每个数据集对应一个特定的时间点,每个数据集都包含几个度量。对于它们中的每一个,我想对每个度量进行单样本 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 值仅适用于一列。所以第一列的第一个值等
可能有更短的方法,但这里有一个建议可以使用所有 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])
}
}
要迭代每列和 mu 值的每个组合并简单地打印出所有 t 检验的结果,purrr::cross2
函数将为您提供所有 column/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 创建
我有几个数据集,每个数据集对应一个特定的时间点,每个数据集都包含几个度量。对于它们中的每一个,我想对每个度量进行单样本 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 值仅适用于一列。所以第一列的第一个值等
可能有更短的方法,但这里有一个建议可以使用所有 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])
}
}
要迭代每列和 mu 值的每个组合并简单地打印出所有 t 检验的结果,purrr::cross2
函数将为您提供所有 column/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 创建