CI on cumulated values

Viewed 128

I have measured the emission of acetone and acetaldehydefrom twosoil_types: AandBthree times across 94days```.

I have calculated and visualized the cumulated emission over time, however I am having issues putting CI 95% Bands (+/-2 SD) or even simple error bars would do.

This is what I've managed to do:

df_cum <- df%>%
  group_by(soil_type, compound, days)%>%
  summarise(mean=mean(emission))%>%
  mutate(cum_emission=cumsum(mean)) 


  plot <- ggplot(df_cum, aes(x = days, y = cum_emission, colour=soil_type)) + 
    geom_line(size = 1)+
    geom_point()+
    scale_colour_manual(values=c("#00AFBB", "brown")) + 
    scale_size_manual(values=c(8.4, 1.7))+
    labs(x = "Time (days)", 
         y = "Cumulated production (umol/g dw soil)", 
         title = "Cumulated production") + 
    labs(shape="", color="") +
    facet_wrap(~compound)+
    theme_bw()

Giving this:

enter image description here

I'm hoping to do be able to put error bars in my plot or do a plot similar to this one with CI:

enter image description here

The data looks like this:

df <- structure(list(days = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 94, 
94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 
94, 94, 94, 94, 94, 94, 94, 94, 94), soil = c(6, 6, 12, 12, 2, 
2, 1, 1, 14, 14, 4, 4, 33, 33, 38, 38, 34, 34, 37, 37, 36, 36, 
13, 13, 32, 32, 5, 5, 3, 3, 35, 35, 6, 6, 12, 12, 2, 2, 1, 1, 
14, 14, 4, 4, 33, 33, 38, 38, 34, 34, 37, 37, 36, 36, 13, 13, 
32, 32, 5, 5, 3, 3, 35, 35, 6, 6, 12, 12, 2, 2, 4, 4, 33, 33, 
38, 38, 34, 34, 37, 37, 36, 36, 13, 13, 5, 5, 3, 3, 35, 35), 
    soil_type = c("B", "B", "A", "A", "B", "B", "B", "B", "A", 
    "A", "B", "B", "B", "B", "B", "B", "A", "A", "B", "B", "A", 
    "A", "A", "A", "B", "B", "A", "A", "B", "B", "B", "B", "B", 
    "B", "A", "A", "B", "B", "B", "B", "A", "A", "B", "B", "B", 
    "B", "B", "B", "A", "A", "B", "B", "A", "A", "A", "A", "B", 
    "B", "A", "A", "B", "B", "B", "B", "B", "B", "A", "A", "B", 
    "B", "B", "B", "B", "B", "B", "B", "A", "A", "B", "B", "A", 
    "A", "A", "A", "A", "A", "B", "B", "B", "B"), compound = c("Acetone", 
    "Acetaldehyde", "Acetone", "Acetaldehyde", "Acetone", "Acetaldehyde", 
    "Acetone", "Acetaldehyde", "Acetone", "Acetaldehyde", "Acetone", 
    "Acetaldehyde", "Acetone", "Acetaldehyde", "Acetone", "Acetaldehyde", 
    "Acetone", "Acetaldehyde", "Acetone", "Acetaldehyde", "Acetone", 
    "Acetaldehyde", "Acetone", "Acetaldehyde", "Acetone", "Acetaldehyde", 
    "Acetone", "Acetaldehyde", "Acetone", "Acetaldehyde", "Acetone", 
    "Acetaldehyde", "Acetone", "Acetaldehyde", "Acetone", "Acetaldehyde", 
    "Acetone", "Acetaldehyde", "Acetone", "Acetaldehyde", "Acetone", 
    "Acetaldehyde", "Acetone", "Acetaldehyde", "Acetone", "Acetaldehyde", 
    "Acetone", "Acetaldehyde", "Acetone", "Acetaldehyde", "Acetone", 
    "Acetaldehyde", "Acetone", "Acetaldehyde", "Acetone", "Acetaldehyde", 
    "Acetone", "Acetaldehyde", "Acetone", "Acetaldehyde", "Acetone", 
    "Acetaldehyde", "Acetone", "Acetaldehyde", "Acetone", "Acetaldehyde", 
    "Acetone", "Acetaldehyde", "Acetone", "Acetaldehyde", "Acetone", 
    "Acetaldehyde", "Acetone", "Acetaldehyde", "Acetone", "Acetaldehyde", 
    "Acetone", "Acetaldehyde", "Acetone", "Acetaldehyde", "Acetone", 
    "Acetaldehyde", "Acetone", "Acetaldehyde", "Acetone", "Acetaldehyde", 
    "Acetone", "Acetaldehyde", "Acetone", "Acetaldehyde"), emission = c(0.001, 
    0.001, 0.009, 0.004, 0.029, 0.032, 0.066, 0.057, 0.015, 0.015, 
    0, 0.003, 0.015, 0.011, 0.016, 0.005, 0.046, 0.011, 0.004, 
    0.005, 0.015, 0.003, 0.025, 0.012, 0.001, 0.001, 0.004, 0, 
    0.012, 0.002, 0.003, 0.002, 0.006, 0, 0.008, 0.001, 0.061, 
    0.055, 0.076, 0.056, 0.056, 0.074, 0, 0, 0.018, 0.02, 0.015, 
    0.001, 0.064, 0, 0.012, 0.004, 0.009, 0, 0.399, 0.037, 0.002, 
    0.001, 0.116, 0, 0.139, 0, 0.004, 0.001, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0.001, 0, 0, 0, 0, 0, 0, 0, 0.001, 0.005, 
    0.001, 0, 0.002, 0)), row.names = c(NA, -90L), class = c("tbl_df", 
"tbl", "data.frame"))
new_df <- structure(list(daysincubated4 = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 4L, 4L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 
10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 4L, 4L, 
4L, 4L, 4L, 4L), soil = c(6L, 6L, 12L, 12L, 2L, 2L, 1L, 1L, 14L, 
14L, 4L, 4L, 13L, 13L, 5L, 5L, 3L, 3L, 6L, 6L, 12L, 12L, 2L, 
2L, 1L, 1L, 14L, 14L, 4L, 4L, 6L, 6L, 12L, 12L, 2L, 2L, 1L, 1L, 
14L, 14L, 4L, 4L, 13L, 13L, 5L, 5L, 3L, 3L, 13L, 13L, 5L, 5L, 
3L, 3L), soil_type = c("SOC<10", "SOC<10", "SOC>10", "SOC>10", 
"SOC<10", "SOC<10", "SOC<10", "SOC<10", "SOC>10", "SOC>10", "SOC<10", 
"SOC<10", "SOC>10", "SOC>10", "SOC>10", "SOC>10", "SOC<10", "SOC<10", 
"SOC<10", "SOC<10", "SOC>10", "SOC>10", "SOC<10", "SOC<10", "SOC<10", 
"SOC<10", "SOC>10", "SOC>10", "SOC<10", "SOC<10", "SOC<10", "SOC<10", 
"SOC>10", "SOC>10", "SOC<10", "SOC<10", "SOC<10", "SOC<10", "SOC>10", 
"SOC>10", "SOC<10", "SOC<10", "SOC>10", "SOC>10", "SOC>10", "SOC>10", 
"SOC<10", "SOC<10", "SOC>10", "SOC>10", "SOC>10", "SOC>10", "SOC<10", 
"SOC<10"), compound = c("Acetone", "Acetaldehyde", "Acetone", 
"Acetaldehyde", "Acetone", "Acetaldehyde", "Acetone", "Acetaldehyde", 
"Acetone", "Acetaldehyde", "Acetone", "Acetaldehyde", "Acetone", 
"Acetaldehyde", "Acetone", "Acetaldehyde", "Acetone", "Acetaldehyde", 
"Acetone", "Acetaldehyde", "Acetone", "Acetaldehyde", "Acetone", 
"Acetaldehyde", "Acetone", "Acetaldehyde", "Acetone", "Acetaldehyde", 
"Acetone", "Acetaldehyde", "Acetone", "Acetaldehyde", "Acetone", 
"Acetaldehyde", "Acetone", "Acetaldehyde", "Acetone", "Acetaldehyde", 
"Acetone", "Acetaldehyde", "Acetone", "Acetaldehyde", "Acetone", 
"Acetaldehyde", "Acetone", "Acetaldehyde", "Acetone", "Acetaldehyde", 
"Acetone", "Acetaldehyde", "Acetone", "Acetaldehyde", "Acetone", 
"Acetaldehyde"), emission = c(0.0011, 0.001, 0.0094, 0.0042, 
0.0289, 0.0318, 0.0656, 0.0571, 0.0152, 0.0146, 0, 0.0033, 0.0247, 
0.0117, 0.0038, 3e-04, 0.0124, 0.0016, 8e-04, 1e-04, 0.0188, 
0.0139, 0.0728, 0.0818, 0.0883, 0.0731, 0.0251, 0.0774, 0, 0, 
0.0061, 2e-04, 0.0084, 7e-04, 0.061, 0.0551, 0.0761, 0.0559, 
0.0563, 0.0742, 0, 0, 0.3989, 0.0367, 0.1163, 4e-04, 0.1386, 
4e-04, 0.0461, 0.0495, 0.089, 0.001, 0.1414, 0.001)), row.names = c(NA, 
-54L), class = c("tbl_df", "tbl", "data.frame"))
2 Answers

If I understood it correctly, you basically need to estimate the confidence interval for your cumulative line for soil type in different compound, if we look at your data:

ggplot(df,aes(x=days,y=cumsum(emission),col=soil_type)) + 
geom_line() + facet_grid(compound ~ soil) + theme_bw() 

enter image description here

What you want to do is estimate the error across lines of the same color in the same row (compound). To do this, we exclude 1 and 14 from your example since it is incomplete. Basically we are trying to convert all your measurements to cumulative, grouped by soil x compound.

We can use stat_summary() to calculate the mean and se:

df %>% filter(!soil %in% c(1,14)) %>% 
group_by(soil,compound) %>% 
mutate(c_emission = cumsum(emission)) %>% 
ggplot(aes(x = days, y = c_emission, col=soil_type,fill=soil_type)) + 
stat_summary(geom="line", fun = mean) + 
stat_summary(geom="ribbon",alpha=0.05,linetype="dotted")+ 
facet_wrap(~compound)

enter image description here

What we are plotting above is the mean at every time point, + 1* standard error. If you want the 95% confidence interval

df %>% filter(!soil %in% c(1,14)) %>% 
group_by(soil,compound) %>% 
mutate(c_emission = cumsum(emission)) %>% 
ggplot(aes(x = days, y = c_emission, col=soil_type,fill=soil_type)) +
stat_summary(geom="line",fun = mean) + 
stat_summary(geom="ribbon",alpha=0.05,linetype="dotted",
fun.data = mean_cl_normal)+ 
facet_wrap(~compound)

enter image description here

The confidence interval is huge because your standard error is large.. Might be better when you have more samples.

To plot error bars, have you already tried with

geom_errorbar(aes(ymin = y- 2*sd, xmax = y+ 2*sd), width = .1, position=position_dodge(.9))

with sd being your standard deviation? you can calculate it in the mutate(...) part of the code. I am afraid, though, that you don't have enough replicates to calculate sd/CI. Am I missing something?

Related