R语言 各组的多重置信区间

4si2a6ki  于 2023-05-20  发布在  其他
关注(0)|答案(3)|浏览(110)

我试图计算90多列的多个均值和95%置信区间:
样本数据:

Group| A_pre  |    A_post |  B_pre |  B_post 

0       20          21        20        23
1       30          10        19        11
2       10          53        30        34
1       22          32        25        20
2       34          40        32        30
0       30          50        NA        40
0       39          40        19        20
1       40          NA        20        20
2       50          10        20        10
0       34          23        30        10
library(dplyr)
library(gmodels)
df <- df %>% 
  group_by(group) %>% 
  dplyr::summarize_all(list(~mean(., trim = 0), ~ci(.,)), na.rm=TRUE)

我得到错误Error in UseMethod("ci") : no applicable method for 'ci' applied to an object of class "c('grouped_df', 'tbl_df', 'tbl', 'data.frame')"
我可以使用得到单独的列ci,但这对于90列来说很耗时:

library(rcompanion)
  groupwiseMean(x ~ group,
              data   = df,
              conf   = 0.95,
              digits = 3, na.rm = T)

有没有办法绕过gmodels错误或其他方法?

vxbzzdmp

vxbzzdmp1#

当您使用%>%管道时,.指的是通过管道输入的内容,在本例中是 Dataframe 。对于purrr样式的lambda表达式,应该使用.x作为参数。
summarize_all()已经过时了。您可以尝试使用替换across()

summarize(across(everything(),
  .fns = list(
    mean = ~mean(.x, na.rm = TRUE, trim = 0),
    ci = ~ ci(.x, na.rm = TRUE)
  )
))

它看起来也像是将na.rm = TRUEsummarize_all()传递给...参数,但是当您使用带有~表示法的lambda表达式时,它不会被传递,所以我尝试纠正它。
这是未经测试的,没有提供样本数据,但我认为它应该工作,假设您的数据列都是数字。

yqlxgs2m

yqlxgs2m2#

这将工作:我们可以使用自己的ci函数:

#custom ci function:

library(dplyr)

ci <- function(x) {
  mean_val <- mean(x, na.rm = TRUE)
  se <- sqrt(var(x, na.rm = TRUE) / length(x))
  ci_lower <- mean_val - (1.96 * se)
  ci_upper <- mean_val + (1.96 * se)
  return(c(ci_lower, ci_upper))
}

df %>%
  reframe(across(everything(), list(mean = mean, ci = ci)), .by=Group)
Group A_pre_mean  A_pre_ci A_post_mean A_post_ci B_pre_mean B_pre_ci B_post_mean B_post_ci
1     0   30.75000 22.854054    33.50000 19.861911         NA 17.03889    23.25000  11.02616
2     0   30.75000 38.645946    33.50000 47.138089         NA 28.96111    23.25000  35.47384
3     1   30.66667 20.461274          NA  3.396334   21.33333 17.69573    17.00000  11.12000
4     1   30.66667 40.872060          NA 38.603666   21.33333 24.97094    17.00000  22.88000
5     2   31.33333  8.550822    34.33333  9.378052   27.33333 20.05812    24.66667  10.11624
6     2   31.33333 54.115845    34.33333 59.288614   27.33333 34.60855    24.66667  39.21709
j2qf4p5b

j2qf4p5b3#

考虑到您正在查看90列数据中的组,您希望如何实现这一点可能取决于哪种输出格式对您最有用。
冒着引起人们惊呼的风险,我将提出洞穴人的方法。但它很容易理解,输出也更容易排序。

Data = read.table(header=TRUE, text="

Group A_pre       A_post   B_pre   B_post 
0       20          21        20        23
1       30          10        19        11
2       10          53        30        34
1       22          32        25        20
2       34          40        32        30
0       30          50        NA        40
0       39          40        19        20
1       40          NA        20        20
2       50          10        20        10
0       34          23        30        10
")

Data$Group = factor(Data$Group)

library(rcompanion)

for(i in 2:5){
  
print(colnames(Data[i]))
  
Data1 = data.frame(Value = Data[,i], Group = Data$Group)
  
GM = groupwiseMean(Value ~ Group, data=Data1,
              conf   = 0.95,
              digits = 3, na.rm = T)

print(GM)

cat("\n")

}

.

[1] "A_pre"
  Group n Mean Conf.level Trad.lower Trad.upper
1     0 4 30.8       0.95      17.90       43.6
2     1 3 30.7       0.95       8.26       53.1
3     2 3 31.3       0.95     -18.70       81.3

[1] "A_post"
  Group n Mean Conf.level Trad.lower Trad.upper
1     0 4 33.5       0.95       11.4       55.6
2     1 2 21.0       0.95     -119.0      161.0
3     2 3 34.3       0.95      -20.4       89.1

.
.
.

相关问题