R中成对t检验的数据处理
所以我试着做一个成对的表,并保留每对的p值。 请注意,我还是R的初学者。 我的数据如下所示(尽管要大得多): 其中每行都有其对应的p值。 我发现的一个函数,我认为它可以做到这一点,就是R中成对t检验的数据处理,r,data-manipulation,tidyverse,R,Data Manipulation,Tidyverse,所以我试着做一个成对的表,并保留每对的p值。 请注意,我还是R的初学者。 我的数据如下所示(尽管要大得多): 其中每行都有其对应的p值。 我发现的一个函数,我认为它可以做到这一点,就是pairwise.t.test。 (目前,我只是为每一行运行一个循环,并做一个正常的t检验,然后用p.adjust纠正它们,但我不能做我想要的poolled sd。) 所以我现在的问题是如何构造数据,使R喜欢它。我可以使用Reforme2库中的melt.data.frame,但它不能提供正确的结构。 我是这样使用它
pairwise.t.test
。
(目前,我只是为每一行运行一个循环,并做一个正常的t检验,然后用p.adjust纠正它们,但我不能做我想要的poolled sd。)
所以我现在的问题是如何构造数据,使R喜欢它。我可以使用Reforme2库中的melt.data.frame
,但它不能提供正确的结构。
我是这样使用它的:
Test_Data <- melt(df, "a", c("b1","b2","b3","c1","c2","c3"))
Test_Data使用该软件包的可能解决方案
首先,将数据帧的格式调整为以下结构
library(tidyverse)
df2 <- df %>%
gather(Column, Value, -a) %>%
extract(Column, into = c("Group", "Number"), regex = "([A-Za-z]+)([0-9]+)")
df2
# a Group Number Value
# 1 ID1 b 1 0.640310605
# 2 ID2 b 1 0.009495756
# 3 ID3 b 1 0.232550506
# 4 ID4 b 1 0.666083758
# 5 ID5 b 1 0.514251141
# 6 ID1 b 2 0.693591292
# 7 ID2 b 2 0.544974836
# 8 ID3 b 2 0.282733584
# 9 ID4 b 2 0.923433484
# 10 ID5 b 2 0.292315840
# 11 ID1 b 3 0.837295628
# 12 ID2 b 3 0.286223285
# 13 ID3 b 3 0.266820780
# 14 ID4 b 3 0.186722790
# 15 ID5 b 3 0.232225911
# 16 ID1 c 1 0.316612455
# 17 ID2 c 1 0.302693371
# 18 ID3 c 1 0.159046003
# 19 ID4 c 1 0.039995918
# 20 ID5 c 1 0.218799541
# 21 ID1 c 2 0.810598552
# 22 ID2 c 2 0.525697547
# 23 ID3 c 2 0.914658166
# 24 ID4 c 2 0.831345047
# 25 ID5 c 2 0.045770263
# 26 ID1 c 3 0.456091482
# 27 ID2 c 3 0.265186672
# 28 ID3 c 3 0.304672203
# 29 ID4 c 3 0.507306870
# 30 ID5 c 3 0.181096208
最后,将p值作为新列添加到原始数据帧中
df_final <- df %>% mutate(Adjusted_P_value = p_value)
df_final
# a b1 b2 b3 c1 c2 c3 Adjusted_P_value
# 1 ID1 0.640310605 0.6935913 0.8372956 0.31661245 0.81059855 0.4560915 0.3391364
# 2 ID2 0.009495756 0.5449748 0.2862233 0.30269337 0.52569755 0.2651867 0.5043753
# 3 ID3 0.232550506 0.2827336 0.2668208 0.15904600 0.91465817 0.3046722 0.4598274
# 4 ID4 0.666083758 0.9234335 0.1867228 0.03999592 0.83134505 0.5073069 0.6764142
# 5 ID5 0.514251141 0.2923158 0.2322259 0.21879954 0.04577026 0.1810962 0.1178471
df_最终%变异(调整后的_P_值=P_值)
决赛
#b1 b2 b3 c1 c2 c3调整后的压力值
#1 ID1 0.640310605 0.6935913 0.8372956 0.31661245 0.81059855 0.4560915 0.3391364
#2 ID2 0.009495756 0.5449748 0.2862233 0.30269337 0.52569755 0.2651867 0.5043753
#3 ID3 0.232550506 0.2827336 0.2668208 0.15904600 0.91465817 0.3046722 0.4598274
#4 ID4 0.666083758 0.9234335 0.1867228 0.03999592 0.83134505 0.5073069 0.6764142
#5 ID5 0.514251141 0.2923158 0.2322259 0.21879954 0.04577026 0.1810962 0.1178471
数据
set.seed(1234)
a <- factor(c("ID1","ID2","ID3","ID4","ID5"))
b <- runif(5)
b1 <- runif(5)
b2 <- runif(5)
b3 <- runif(5)
c1 <- runif(5)
c2 <- runif(5)
c3 <- runif(5)
df <- data.frame(a,b1,b2,b3,c1,c2,c3)
set.seed(1234)
a我的方法与另一个答案略有不同,通过时间测量(1-3)将数据分成两列,b
和c
,然后使用t.test(…,paired=TRUE)
进行成对t检验
set.seed(1234)
a <- factor(c("ID1","ID2","ID3","ID4","ID5"))
b <- runif(5)
b1 <- runif(5)
b2 <- runif(5)
b3 <- runif(5)
c1 <- runif(5)
c2 <- runif(5)
c3 <- runif(5)
df <- data.frame(a,b1,b2,b3,c1,c2,c3)
library(tidyr)
library(dplyr)
df %>%
gather(.,key="variable",value="value",-a) %>%
extract(.,variable,into = c("measure", "time"),
regex = "([A-Za-z]+)([0-9]+)") %>%
spread(.,measure,value) -> spreadData
# split by ID to conduct paired t-tests by ID
dataList <- split(spreadData,spreadData$a)
pValues <- unlist(lapply(dataList,function(x){
t.test(x$b,x$c,paired=TRUE)$p.value
}))
df$p.value <- pValues
df
注意:如果其中一个修改了另一个答案中的代码以包含paired=TRUE
参数,则两个解决方案中的p值匹配
替代方法:对c和b之间的差异进行t检验
鉴于这篇文章中关于成对t检验的评论,我想我应该说明一下成对t检验的情况。基本上,对于每个时间段1-3,我们从c
值中减去b
值,并对差异进行t检验。由于我们已将数据缩减为一列,因此不需要使用paired=
参数,但测试产生的结果与将两列的paired=TRUE
参数传递给t.test()相同
#备选方案2:从c中减去b,并使用常规t检验
#来展示两两是如何工作的
spreadData$差异只需添加到Baraliuh解决方案:
然而,map_dbl(“p.value”)不起作用,
map_df(“p.value”)在我的例子中起作用Trylappy(split(Test_Data,Test_Data$a),function(TD)t.Test(value~grepl(“b”,variable),TD))
。好吧,我想这正是我想要的。我需要阅读并了解一些细节。我不明白的一件事是如何选择要测试的列?因为,我简化了我发布的数据集,需要更具选择性(我的组比b和c组多)。我会接受这个答案,因为我可以制作与此解释相符的数据帧!:)非常感谢。pairwise.t.test()
函数需要一个paired=TRUE
参数来执行成对测试。@www-pairwise.t.test()的参数有点古怪,因为人们希望此函数的默认值为paired=TRUE
。我正要发布我的答案,这时我注意到你的帖子出现在网站上,我必须弄清楚为什么我们的答案中的p值不匹配。@LenGreski我认为pairwise.t.test()的“pairwise”(成对)意思是多个测试中的“组级别之间的成对比较”,而不是“每对的比较”。这有点令人困惑。由于OP的问题,这是我第一次研究这个函数。再次感谢你。我承认我是“老派”,因为我在很多年前学会了进行两两t检验,将数据分成两列,这样每个观察都有一个“之前”和“之后”列,t检验基本上是从后面减去之前,然后对结果进行t检验。我打赌这也是一个非常好的答案(如果我有更高的声誉,我会投票)不过,我很难理解发生了什么;我需要在我的假数据集上玩一玩。从两个答案中,我显然需要阅读更多关于这个tidyr软件包的内容。我想到的一个问题是,如何使用regex
函数选择某些列名?@Baraliuh-没问题,欢迎来到StackOverflow。输入和输出列名在extract()
函数中指定,而regex=
参数指定一个正则表达式,用于将输入列中的数据拆分为into=
参数中指定的输出列。有关Tidyverse的更多信息可在网站上获得。
p_value <- df2 %>%
split(.$a) %>%
map(function(x) pairwise.t.test(x$Value, x$Group, paired = TRUE)) %>%
map_dbl("p.value")
p_value
# ID1 ID2 ID3 ID4 ID5
# 0.3391364 0.5043753 0.4598274 0.6764142 0.1178471
df_final <- df %>% mutate(Adjusted_P_value = p_value)
df_final
# a b1 b2 b3 c1 c2 c3 Adjusted_P_value
# 1 ID1 0.640310605 0.6935913 0.8372956 0.31661245 0.81059855 0.4560915 0.3391364
# 2 ID2 0.009495756 0.5449748 0.2862233 0.30269337 0.52569755 0.2651867 0.5043753
# 3 ID3 0.232550506 0.2827336 0.2668208 0.15904600 0.91465817 0.3046722 0.4598274
# 4 ID4 0.666083758 0.9234335 0.1867228 0.03999592 0.83134505 0.5073069 0.6764142
# 5 ID5 0.514251141 0.2923158 0.2322259 0.21879954 0.04577026 0.1810962 0.1178471
set.seed(1234)
a <- factor(c("ID1","ID2","ID3","ID4","ID5"))
b <- runif(5)
b1 <- runif(5)
b2 <- runif(5)
b3 <- runif(5)
c1 <- runif(5)
c2 <- runif(5)
c3 <- runif(5)
df <- data.frame(a,b1,b2,b3,c1,c2,c3)
set.seed(1234)
a <- factor(c("ID1","ID2","ID3","ID4","ID5"))
b <- runif(5)
b1 <- runif(5)
b2 <- runif(5)
b3 <- runif(5)
c1 <- runif(5)
c2 <- runif(5)
c3 <- runif(5)
df <- data.frame(a,b1,b2,b3,c1,c2,c3)
library(tidyr)
library(dplyr)
df %>%
gather(.,key="variable",value="value",-a) %>%
extract(.,variable,into = c("measure", "time"),
regex = "([A-Za-z]+)([0-9]+)") %>%
spread(.,measure,value) -> spreadData
# split by ID to conduct paired t-tests by ID
dataList <- split(spreadData,spreadData$a)
pValues <- unlist(lapply(dataList,function(x){
t.test(x$b,x$c,paired=TRUE)$p.value
}))
df$p.value <- pValues
df
> df
a b1 b2 b3 c1 c2
1 ID1 0.640310605 0.6935913 0.8372956 0.31661245 0.81059855
2 ID2 0.009495756 0.5449748 0.2862233 0.30269337 0.52569755
3 ID3 0.232550506 0.2827336 0.2668208 0.15904600 0.91465817
4 ID4 0.666083758 0.9234335 0.1867228 0.03999592 0.83134505
5 ID5 0.514251141 0.2923158 0.2322259 0.21879954 0.04577026
c3 p.value
1 0.4560915 0.3391364
2 0.2651867 0.5043753
3 0.3046722 0.4598274
4 0.5073069 0.6764142
5 0.1810962 0.1178471
>
# alternative 2: subtract b from c and use regular t-test
# to show how pairwise works
spreadData$difference <- spreadData$c - spreadData$b
dataList <- split(spreadData,spreadData$a)
pValues <- unlist(lapply(dataList,function(x){
t.test(x$difference)$p.value
}))
df$p.value <- pValues
df
> spreadData$difference <- spreadData$c - spreadData$b
> dataList <- split(spreadData,spreadData$a)
> pValues <- unlist(lapply(dataList,function(x){
+ t.test(x$difference)$p.value
+ }))
> df$p.value <- pValues
> df
a b1 b2 b3 c1 c2
1 ID1 0.640310605 0.6935913 0.8372956 0.31661245 0.81059855
2 ID2 0.009495756 0.5449748 0.2862233 0.30269337 0.52569755
3 ID3 0.232550506 0.2827336 0.2668208 0.15904600 0.91465817
4 ID4 0.666083758 0.9234335 0.1867228 0.03999592 0.83134505
5 ID5 0.514251141 0.2923158 0.2322259 0.21879954 0.04577026
c3 p.value
1 0.4560915 0.3391364
2 0.2651867 0.5043753
3 0.3046722 0.4598274
4 0.5073069 0.6764142
5 0.1810962 0.1178471
>