Saya memiliki barplot, tetapi ingin menjalankan Wilcox.test dalam setiap "grp1" membandingkan bar dengan kontrol untuk grup itu, dan kemudian meletakkan asterix jika signifikan.

Saya telah melihat "compare_means" untuk mendapatkan perbandingan, tetapi saya mencoba membuatnya otomatis dan tidak terlalu manual. Akankah "geom_signif" atau "stat_compare_means" melakukan ini? Dapatkah seseorang membantu dengan ini? Terima kasih banyak.

Saya perlu perbandingan dibuat menggunakan dataset lengkap, bukan hanya sarana (yang hanya satu nilai per batang). Saya menambahkan baris di akhir kode yang menjalankan salah satu perbandingan sehingga Anda dapat melihat dari mana saya membutuhkan nilai-p.

y <- c(runif(100,0,4.5),runif(100,3,6),runif(100,4,7))
grp1 <- sample(c("A","B","C","D"),size = 300, replace = TRUE)
grp2 <- rep(c("High","Med","Contrl"),each=100)
dataset <- data.frame(y,grp1,grp2)

means <- aggregate(y~grp1+grp2,data=dataset,mean)
sd <- aggregate(y~grp1+grp2,data=dataset,function(x){sd(x)})

means.all <- merge(sd,means,by=c("grp1","grp2"))
names(means.all)[3:4] <- c("sd","y.mean")

library(ggplot2)
p<- ggplot(means.all, aes(x=grp1, y=y.mean, fill=grp2))+ 
  geom_bar(stat="identity", color="black", 
           position=position_dodge()) +
  geom_errorbar(aes(ymin=y.mean-sd, ymax=y.mean+sd), width=.2,
                position=position_dodge(.9))
p

compare_means(y~grp2,data = dataset[dataset$grp1=="A",],method="wilcox.test")
1
Schatzi121 19 November 2020, 21:23

1 menjawab

Jawaban Terbaik

Mungkin ini bukan cara yang optimal tetapi Anda dapat membuat daftar yang memisahkan data dan menerapkan fungsi stat_compare_means() satu per satu di setiap tingkat data Anda. Setelah itu Anda dapat mengatur plot menjadi satu menggunakan patchwork:

library(ggplot2)
library(ggpubr)
library(patchwork)
#Split data
List <- split(means.all,means.all$grp1)
#Function for plot
myfun <- function(x)
{
  #Ref group
  rg <- paste0(unique(x$grp1),'.','Contrl')
  #Plot
  G <- ggplot(x, aes(x=interaction(grp1,grp2), y=y.mean, fill=grp2))+ 
    geom_bar(stat="identity", color="black", 
             position=position_dodge()) +
    geom_errorbar(aes(ymin=y.mean-sd, ymax=y.mean+sd), width=.2,
                  position=position_dodge(.9))+
    stat_compare_means(ref.group = rg,label =  "p.signif",method = "wilcox.test",label.y = 7)+
    theme(axis.text.x = element_blank())+
    xlab(unique(x$grp1))
  return(G)
}
#Apply
Lplot <- lapply(List, myfun)
#Wrap plots
wrap_plots(Lplot,nrow = 1)+plot_layout(guides = 'collect')

Keluaran:

enter image description here

Pertimbangkan pembaruan ini yang mengambil nilai untuk tanda bintang yang disimpan dalam kerangka data baru:

#Create p-vals dataset
List2 <- split(dataset,dataset$grp1)
#p-val function
mypval <- function(x)
{
  y <- compare_means(y~grp2,data = x,method="wilcox.test")
  y <- y[,c('group2', 'group1','p.signif')]
  names(y)<-c('grp2','grp1','p.signif')
  y <- y[y$grp2=='Contrl',]
  y$grp2 <- y$grp1
  y <- rbind(y,data.frame(grp2='Contrl',grp1='',p.signif=''))
  y$grp1 <- unique(x$grp1)
  y$y.mean=7
  return(y)
}
#Apply
dfpvals <- lapply(List2, mypval)
df <- do.call(rbind,dfpvals)
#Plot
ggplot(means.all, aes(x=grp1, y=y.mean, fill=grp2,group=grp2))+ 
  geom_bar(stat="identity", color="black", 
           position=position_dodge()) +
  geom_errorbar(aes(ymin=y.mean-sd, ymax=y.mean+sd), width=.2,
                position=position_dodge(.9))+
  geom_text(data=df,aes(x=grp1, y=y.mean,group=grp2,label=p.signif),
            position=position_dodge(0.9))

Keluaran:

enter image description here

1
Duck 19 November 2020, 23:37