Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R中成对t检验的数据处理_R_Data Manipulation_Tidyverse - Fatal编程技术网

R中成对t检验的数据处理

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,但它不能提供正确的结构。 我是这样使用它

所以我试着做一个成对的表,并保留每对的p值。 请注意,我还是R的初学者。 我的数据如下所示(尽管要大得多):

其中每行都有其对应的p值。 我发现的一个函数,我认为它可以做到这一点,就是
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”)在我的例子中起作用

Try
lappy(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
>