我如何将每组 4 行中的值与一个值(Wilcox 测试指定 mu)进行比较?

问题描述 投票:0回答:3

我需要使用 Wilcoxon 符号秩和检验将每四行中的值与一个值(作为 mu)进行比较。例如,如果我的数据是这样的:

df1 <- c(0.205346764819837, 0.260927758796802, 0.243880102849495, 0.244549329012715, 
      0.122609277587968, 0.19381141911169, 0.0617801415941672, 0.217762671269064, 
      0.0513190799901377, 0.293455672572294, 0.222447254411609, 0.271001373674756, 
      0.00119756260786869, 0.119069423408827, -0.0164312634285513, 
      0.0446268183579303)

     
df2 <- c(0.23340509, 0.05959987, 0.17380963, 0.14517836)

我正在使用

wilcox.test
将 df1 中的四个值中的每一个与 df_stack2 中的一个值 mu 进行比较。考虑只有前四行的 df

wilcox.test(dfnew$A, mu=0.23340509)$p.value. 

我意识到我可以通过使用每四行分组:

split(df, as.integer(gl(nrow(df) 4, nrow(df))))

我希望在 mapply 中采用它(因此我可以与 future.apply 并行化,因为我的数据框的实际大小),但是,我有点不确定如何指定每四行进行比较一个值(在单独的数据框中)为 mu?

r statistics mapply pairwise.wilcox.test
3个回答
0
投票

您可以使用

rep()
创建您的组并按组应用您的功能:

library(data.table)
setDT(dfnew)[, grp:=rep(1:(.N/4), each=4, length.out=.N)]
dfnew[, .(pval = wilcox.test(A, mu=df2[.BY$grp])$p.value), grp]

输出:

     grp  pval
   <int> <num>
1:     1 0.875
2:     2 0.125
3:     3 0.875
4:     4 0.125

类似地,使用

dplyr

dfnew %>% 
  group_by(grp = rep(1:(n()/4), each=4, length.out=n())) %>% 
  summarize(pval = wilcox.test(A,mu = df2[cur_group()$grp])$p.value)

输出:

    grp  pval
  <int> <dbl>
1     1 0.875
2     2 0.125
3     3 0.875
4     4 0.125

您可能会发现另一种有趣的方法:

setDT(dfnew)[, .(pval = wilcox.test(A, mu=.BY$mu)$p.value), .(mu = rep(df2, each=4))]

输出:

           mu  pval
        <num> <num>
1: 0.23340509 0.875
2: 0.05959987 0.125
3: 0.17380963 0.875
4: 0.14517836 0.125


0
投票

您可以创建一个包含 4 个元素的列表,其中列表的每个元素包含

df1
的每四个值。然后使用来自
map2()
包或
purrr
系列的
tidyverse()
,您可以为拆分列表的每个块提供来自
mu
的相应
df2

library(tidyverse)

# split df1 into 4 chunks of size 4 (or 4 elements of size 4)

      df1split <- split(df1, ceiling(seq_along(df1) / 4))

#calculate wilcoxon test for each chunk using map2()

      map2(df1split,df2, ~ wilcox.test(.x, mu =.y)$p.value) 

$`1`
[1] 0.875       # pvalue of first chunk 

$`2`
[1] 0.125       # pvalue of second chunk

$`3`
[1] 0.875       # pvalue of third chunk

$`4`
[1] 0.125       # pvalue of fourth chunk

要将

p-values
从列表返回到数据框中,您可以将以下代码添加到
map2()

map2(df1split,df2, ~ wilcox.test(.x, mu =.y)$p.value) %>% 
     bind_rows() %>% t() %>% as.data.frame() %>% 
     rename("p-value" = "V1")

    
  p-value
1  0.875
2  0.125
3  0.875
4  0.125

0
投票

另一个库的另一种方法:

library(matrixTests)

# turn each 4-observation entry into a separate row in a matrix:
m1 <- matrix(df1, ncol=4, byrow=TRUE)

# perform the test:
row_wilcoxon_onesample(m1, df2)
  obs statistic pvalue location.null alternative exact corrected
1   4         6  0.875    0.23340509   two.sided  TRUE     FALSE
2   4        10  0.125    0.05959987   two.sided  TRUE     FALSE
3   4         6  0.875    0.17380963   two.sided  TRUE     FALSE
4   4         0  0.125    0.14517836   two.sided  TRUE     FALSE
© www.soinside.com 2019 - 2024. All rights reserved.