This is a test version of Biostars. For the public version, visit https://www.biostars.org.
Add stats to the plot

Hello,

I would like to add stats to this plot. Any help would be much appreciated and thanks in advance

Here is my code:

data4.ts%>%  ungroup() %>% t.test(data =.,value ~ Condition) %>%
  adjust_pvalue(method = "bonferroni") 

data2.ts %>%  ungroup() %>% t.test(data =.,value ~ Condition) %>%
  adjust_pvalue(method = "bonferroni") 

a %>% 
  filter(name == "norm_CntTs",
         !is.na(coding)) %>% 
  ggplot(aes(x = Condition, y = value, color = Condition))+
  geom_boxplot(width = 0.5,
               show.legend = FALSE)+
  scale_y_log10()+
  scale_color_manual(
    values = c(
      "HRSV" = "#eb4a40",
      "HRSV_RBV" = "#045275"
    )
  )+
  facet_wrap(.~coding,ncol = 1)
+
  labs(
    title = "Ts",
    y = "Average Ts count" 
  )+
  theme_bw()+
  theme(
    text = element_text(size = 12),
    plot.title = element_text(hjust = 0.5),
    #strip.background = element_rect(color =)
    strip.text = element_text(face = "bold")
  )

enter image description here

r

Hi, you can add statistical annotations using ggpubr function stat_pvalue_manual. You need to make sure you calculate the p-values first and then use the stat_pvalue_manual function to add these values to the plot. For example:

data4_test <- data4.ts %>%
  ungroup() %>%
  t.test(value ~ Condition) %>%
  broom::tidy() %>%
  mutate(p.adjusted = p.adjust(p.value, method = "bonferroni"),
         group1 = levels(data4.ts$Condition)[1],
         group2 = levels(data4.ts$Condition)[2])

data2_test <- data2.ts %>%
  ungroup() %>%
  t.test(value ~ Condition) %>%
  broom::tidy() %>%
  mutate(p.adjusted = p.adjust(p.value, method = "bonferroni"),
         group1 = levels(data2.ts$Condition)[1],
         group2 = levels(data2.ts$Condition)[2])

stat_test <- bind_rows(data4_test, data2_test)

a_filtered <- a %>%
  filter(name == "norm_CntTs", !is.na(coding))

plot <- ggplot(a_filtered, aes(x = Condition, y = value, color = Condition)) +
  geom_boxplot(width = 0.5, show.legend = FALSE) +
  scale_y_log10() +
  scale_color_manual(values = c("HRSV" = "#eb4a40", "HRSV_RBV" = "#045275")) +
  facet_wrap(. ~ coding, ncol = 1) +
  labs(title = "Ts", y = "Average Ts count") +
  theme_bw() +
  theme(text = element_text(size = 12),
        plot.title = element_text(hjust = 0.5),
        strip.text = element_text(face = "bold"))

plot_stats <- plot + 
  stat_pvalue_manual(stat_test, 
                     label = "p.adjusted",
                     y.position = max(a_filtered$value) * 1.1, 
                     label.size = 3.5,
                     tip.length = 0.01)

Check the code

Thanks. That helpful.

I am getting this error

data4_test <- data4.ts%>%  ungroup() %>% t.test(data =.,value ~ Condition)%>%
+   broom::tidy() %>%
+   mutate(p.adjusted = p.adjust(p.value, method = "bonferroni"),
+          group1 = levels(data4.ts$Condition)[1],
+          group2 = levels(data4.ts$Condition)[2])
> 
> data2_test <-data2.ts %>%  ungroup() %>% t
.test(data =.,value ~ Condition) %>%
+   broom::tidy() %>%
+   mutate(p.adjusted = p.adjust(p.value, method = "bonferroni"),
+          group1 = levels(data2.ts$Condition)[1],
+          group2 = levels(data2.ts$Condition)[2])
> 
> stat_test <- bind_rows(data4_test, data2_test)
> 
> a_filtered <- a %>%
+   filter(name == "norm_CntTs", !is.na(coding))
> 
> plot <- ggplot(a_filtered, aes(x = Condition, y = value, color = Condition)) +
+   geom_boxplot(width = 0.5, show.legend = FALSE) +
+   scale_y_log10() +
+   scale_color_manual(values = c("HRSV" = "#eb4a40", "HRSV_RBV" = "#045275")) +
+   facet_wrap(. ~ coding, ncol = 1) +
+   labs(title = "Ts", y = "Average Ts count") +
+   theme_bw() +
+   theme(text = element_text(size = 12),
+         plot.title = element_text(hjust = 0.5),
+         strip.text = element_text(face = "bold"))
> 
> plot_stats <- plot + 
+   stat_pvalue_manual(stat_test, 
+                      label = "p.adjusted",
+                      y.position = max(a_filtered$value) * 1.1, 
+                      label.size = 3.5,
+                      tip.length = 0.01)



Error in asserttat_group_columns_exists(data) : 
  data should contain group1 and group2 columns

Please use 101010 to format code so it is represented in monospace font. I have done this for you now.

I think this is what caused the error. we do not have group 1 and 2 in the statistical test results????

enter image description here

The error is likely due to the fact that the structure of your data in data4.ts and data2.ts may not contain the Condition values. The group1 and group2 columns are added based on this. The Condition column should be a factor or a categorical variable that distinguishes between the groups you are comparing. Could you show me data4.ts and data2.ts?

Thanks, thats really helpful

enter image description here

enter image description here

Thank you, it seems to be clearer. Your Condition already has two factorial levels. You can replace these names in groups 1 and 2.

data4_test <- data4.ts %>%
  ungroup() %>%
  t.test(value ~ Condition) %>%
  broom::tidy() %>%
  mutate(p.adjusted = p.adjust(p.value, method = "bonferroni"),
         group1 = "HRSV",
         group2 = "HRSV_RBV")

data2_test <- data2.ts %>%
  ungroup() %>%
  t.test(value ~ Condition) %>%
  broom::tidy() %>%
  mutate(p.adjusted = p.adjust(p.value, method = "bonferroni"),
         group1 = "HRSV",
         group2 = "HRSV_RBV")

stat_test <- bind_rows(data4_test, data2_test)

a_filtered <- a %>%
  filter(name == "norm_CntTs", !is.na(coding))

plot <- ggplot(a_filtered, aes(x = Condition, y = value, color = Condition)) +
  geom_boxplot(width = 0.5, show.legend = FALSE) +
  scale_y_log10() +
  scale_color_manual(values = c("HRSV" = "#eb4a40", "HRSV_RBV" = "#045275")) +
  facet_wrap(. ~ coding, ncol = 1) +
  labs(title = "Ts", y = "Average Ts count") +
  theme_bw() +
  theme(text = element_text(size = 12),
        plot.title = element_text(hjust = 0.5),
        strip.text = element_text(face = "bold"))

plot_stats <- plot + 
  stat_pvalue_manual(stat_test, 
                     label = "p.adjusted",
                     y.position = max(a_filtered$value) * 1.1, 
                     label.size = 3.5,
                     tip.length = 0.01)

Try and let me know

if don't work try binding the stats without group.

stat_data4 <- data4.ts %>%
  ungroup() %>%
  t.test(data = ., value ~ Condition) %>%
  broom::tidy() %>%
  mutate(p.adj = p.adjust(p.value, method = "bonferroni"))

stat_data2 <- data2.ts %>%
  ungroup() %>%
  t.test(data = ., value ~ Condition) %>%
  broom::tidy() %>%
  mutate(p.adj = p.adjust(p.value, method = "bonferroni"))
stat_data <- bind_rows(
  stat_data4 %>% mutate(dataset = "data4"),
  stat_data2 %>% mutate(dataset = "data2")
)

your plot + stat_pvalue_manual(stat_data, label = "p.adj", tip.length = 0.01)

the other parts of the code remain the same. I hope this work, let me know.

Thanks for the help. Unfortunately, did not work :(

error in asserttat_group_columns_exists(data) : data should contain group1 and group2 columns

1 answer

Finally, It works. I have added this code

my_comparisons=list(c("HRSV", "HRSV_RBV"))

plot + stat_compare_means(method = "wilcox.test",comparisons = my_comparisons, label.y = 4.5, size= 4, hjust= 0.09,vjust=0.7, alternative = "two.sided",
                          paired = F, exact = F, label = "p.value")

enter image description here

Log in to answer this question.