AIM : To find vertical offset to convert standardized absorption spectra of Red, Green and Brown algae to absorbance values (OD) from Enrı́quez, Agustı́, and Duarte (1994) figures 3 and 6.

Document Note : The maps, plots and app within this document are interactive so make sure you give them a play like zooming in and out in the maps but also on the plots. Clicking on the legend allows to only select and display the time series needed.

Table of contents

  1. Assumptions and equation
  1. Axes mis-labelled?

  2. Figure 8 double check

  3. Bibliography

Assumptions and equation

fig6 <- read_csv('Enriquez1994_Fig6_logscale_WebPlotDigitilizer.csv', skip = 1) #%>% 

p <- ggplot(fig6,aes(x=Abs675,y=Abs440)) +
  geom_point() +
  scale_x_continuous(trans='log10', limits=c(0.01, 10)) +
  scale_y_continuous(trans='log10', limits=c(0.1, 10)) +
  geom_smooth(method = 'lm') +
  xlab('Absorbance at 675nm (OD)') +
  ylab('Absorbance at 440nm (OD)') +
  ggtitle('Relationship between Absorbance at 675nm and 440nm (OD) by macrophyte tissues according to Enriquez et al. (Fig. 6') +
  theme_light()
ggplotly(p)

Figure 1 - Rationship between the average absorbance by macrophyte tissues at 440nm and 674nm. From Enrı́quez, Agustı́, and Duarte (1994) figure 6.

lmfit <- lm(log10(Abs440) ~ log10(Abs675), fig6)
summary(lmfit)
## 
## Call:
## lm(formula = log10(Abs440) ~ log10(Abs675), data = fig6)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.34205 -0.14667 -0.03583  0.16327  0.39495 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)    0.17502    0.04198   4.169 0.000134 ***
## log10(Abs675)  0.67738    0.08651   7.830 5.27e-10 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.1963 on 46 degrees of freedom
## Multiple R-squared:  0.5713, Adjusted R-squared:  0.562 
## F-statistic: 61.31 on 1 and 46 DF,  p-value: 5.272e-10

Following the regression:

We assume that \(a_{440} = a_{std440} + offset\) and \(a_{675} = a_{std675} + offset\).

We can then rewrite the regression equation:

Which becomes a root-finding problem, \(offset\) being the unknown parameter to find the value that is the root of the above equation. \(a_{std440}\) and \(a_{std675}\) have different values for Brown, Red and Green algae cf figure 3 of Enrı́quez, Agustı́, and Duarte (1994).

abs_spectra_algal_int <- read_csv('Std_Abs_Spectra_RGB_Enriquez1994.csv')

p_abs <- ggplot(abs_spectra_algal_int) +
  geom_line(aes(x=Lambda,y=Average_Brown),col='brown',lwd=1) +
  geom_line(aes(x=Lambda,y=CI_Sup_Brown),col='brown',lty='dashed') +
  geom_line(aes(x=Lambda,y=CI_Inf_Brown),col='brown',lty='dashed') +
  geom_line(aes(x=Lambda,y=Average_Red),col='red',lwd=1) +
  geom_line(aes(x=Lambda,y=CI_Sup_Red),col='red',lty='dashed') +
  geom_line(aes(x=Lambda,y=CI_Inf_Red),col='red',lty='dashed') +
  geom_line(aes(x=Lambda,y=Average_Green),col='green',lwd=1) +
  geom_line(aes(x=Lambda,y=CI_Sup_Green),col='green',lty='dashed') +
  geom_line(aes(x=Lambda,y=CI_Inf_Green),col='green',lty='dashed') +
  ylab('Standardized Absorbance') +
  ggtitle('Standardized Absorbance of Brown, Red and Green Algae according to Enriquez et al., 1994.') +
  theme_light()
ggplotly(p_abs)

Figure 2 - Standardized Absorbance of Brown, Red and Green Algae according to Enrı́quez, Agustı́, and Duarte (1994) figure 3.

Brown Algae

For brown algae, \(a_{std440_B} = 1.519\) and \(a_{std675_B} = -0.1775\). The equation to find the root (offset value) becomes: \(\log10(a_{std440_B} + offset) - intercept - slope*\log10(a_{std675_B} + offset) = 0\) \(\leftrightarrow \log10(1.519 + offset) - 0.17502 - .67738*\log10(-0.1775 + offset) = 0\)

f_offset <- function(offset,s,i,astd440,astd675){
  log10(astd440 + offset)-i-s*log10(astd675 + offset)
}

offset_vec <- seq(.5,10,.01)
interc <- lmfit$coefficients[1]
slope <- lmfit$coefficients[2]
astd440_b <- abs_spectra_algal_int$Average_Brown[which(abs_spectra_algal_int$Lambda==440)]
astd675_b <- abs_spectra_algal_int$Average_Brown[which(abs_spectra_algal_int$Lambda==675)]

plot(x=offset_vec,y=f_offset(offset_vec,s=slope,i=interc,astd440=astd440_b,astd675=astd675_b),type='l',xlab='Offset range', ylab = 'f(offset)')

The function does not cross the zero horizontal line meaning there is no solution to the equation…

uniroot(f_offset,s=slope,i=interc,astd440=astd440_b,astd675=astd675_b,interval = c(.5,4))#,extendInt="yes")#$root

The root finding function returns an error as there is no root.

Red Algae

For red algae, \(a_{std440_R} = 1.4867\) and \(a_{std675_R} = -0.4009\). The equation to find the root (offset value) becomes: \(\log10(a_{std440_R} + offset) - intercept - slope*\log10(a_{std675_R} + offset) = 0\) \(\leftrightarrow \log10(1.4867 + offset) - 0.17502 - .67738*\log10(-0.4009 + offset) = 0\)

astd440_r <- abs_spectra_algal_int$Average_Red[which(abs_spectra_algal_int$Lambda==440)]
astd675_r <- abs_spectra_algal_int$Average_Red[which(abs_spectra_algal_int$Lambda==675)]

plot(x=offset_vec,y=f_offset(offset_vec,s=slope,i=interc,astd440=astd440_r,astd675=astd675_r),type='l',xlab='Offset range', ylab = 'f(offset)')

The function does not cross the zero horizontal line meaning there is no solution to the equation…

uniroot(f_offset,s=slope,i=interc,astd440=astd440_r,astd675=astd675_r,interval = c(.5,4))#,extendInt="yes")#$root

The root finding function returns an error as there is no root.

Green Algae

For green algae, \(a_{std440_G} = 1.4459\) and \(a_{std675_G} = 0.3709\). The equation to find the root (offset value) becomes: \(\log10(a_{std440_G} + offset) - intercept - slope*\log10(a_{std675_G} + offset) = 0\) \(\leftrightarrow \log10(1.4459 + offset) - 0.17502 - .67738*\log10(0.3709 + offset) = 0\)

astd440_g <- abs_spectra_algal_int$Average_Green[which(abs_spectra_algal_int$Lambda==440)]
astd675_g <- abs_spectra_algal_int$Average_Green[which(abs_spectra_algal_int$Lambda==675)]

plot(x=offset_vec,y=f_offset(offset_vec,s=slope,i=interc,astd440=astd440_g,astd675=astd675_g),type='l',xlab='Offset range', ylab = 'f(offset)')

The function does not cross the zero horizontal line meaning there is no solution to the equation…

uniroot(f_offset,s=slope,i=interc,astd440=astd440_g,astd675=astd675_g,interval = c(.5,4))#,extendInt="yes")#$root

The root finding function returns an error as there is no root.

Axes mis-labelled?

fig6_2 <- read_csv('Enriquez1994_Fig6_10p_WebPlotDigitilizer.csv', skip = 1) #%>% 

p2 <- ggplot(fig6_2,aes(x=Abs675_10p,y=Abs440_10p)) +
  geom_point() +
  #scale_x_continuous(trans='log10', limits=c(0.01, 10)) +
  #scale_y_continuous(trans='log10', limits=c(0.1, 10)) +
  scale_x_continuous(limits=c(-2, 1)) +
  scale_y_continuous(limits=c(-1, 1)) +
  geom_smooth(method = 'lm') +
  xlab('10^Absorbance at 675nm (OD)') +
  ylab('10^Absorbance at 440nm (OD)') +
  ggtitle('Relationship between Absorbance at 675nm and 440nm (OD) by macrophyte tissues according to Enriquez et al. (Fig. 6') +
  theme_light()
ggplotly(p2)

Figure 3 - Rationship between the average absorbance by macrophyte tissues at 440nm and 674nm. From Enrı́quez, Agustı́, and Duarte (1994) figure 6.

lmfit2 <- lm(Abs440_10p ~ Abs675_10p, fig6_2)
summary(lmfit2)
## 
## Call:
## lm(formula = Abs440_10p ~ Abs675_10p, data = fig6_2)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.34907 -0.15213 -0.03442  0.16316  0.39091 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  0.18541    0.04302   4.309 8.79e-05 ***
## Abs675_10p   0.69016    0.08762   7.877 5.21e-10 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.1972 on 45 degrees of freedom
## Multiple R-squared:  0.5796, Adjusted R-squared:  0.5703 
## F-statistic: 62.05 on 1 and 45 DF,  p-value: 5.209e-10

Following the regression:

Figure 8 double check

fig8 <- read_csv('Enriquez1994_Fig8_log10_WebPlotDigitilizer.csv', skip = 1) #%>% 

p8 <- ggplot(fig8,aes(x=Chla_concentration ,y=absorbance_weight )) +
  geom_point() +
  scale_x_continuous(trans='log10', limits=c(0.01, 1000)) +
  scale_y_continuous(trans='log10', limits=c(1, 10000)) +
  geom_smooth(method = 'lm') +
  #xlab('Absorbance at 675nm (OD)') +
  #ylab('Absorbance at 440nm (OD)') +
  ggtitle('Relationship between specific absorbance (per unit of weight) and chla concentration according to Enriquez et al. (Fig. 8)') +
  theme_light()
ggplotly(p8)

Figure 4 - Relationship between specific absorbance (per unit of weight) and chla concentration. From Enrı́quez, Agustı́, and Duarte (1994) figure 8.

lmfit8 <- lm(log10(absorbance_weight) ~ log10(Chla_concentration), fig8)
summary(lmfit8)
## 
## Call:
## lm(formula = log10(absorbance_weight) ~ log10(Chla_concentration), 
##     data = fig8)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.67825 -0.16396 -0.00542  0.17449  0.64536 
## 
## Coefficients:
##                           Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                0.82977    0.03462   23.97   <2e-16 ***
## log10(Chla_concentration)  0.95373    0.03859   24.71   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.2813 on 117 degrees of freedom
## Multiple R-squared:  0.8392, Adjusted R-squared:  0.8378 
## F-statistic: 610.7 on 1 and 117 DF,  p-value: < 2.2e-16

Following the regression:

We find the same coefficients as Enrı́quez, Agustı́, and Duarte (1994) so the method in part 1 should be good hopefully.

Bibliography

Enrı́quez, Susana, Susana Agustı́, and Carlos M Duarte. 1994. “Light Absorption by Marine Macrophytes.” Oecologia 98 (2): 121–29.