# install.packages("ade4")
library(ade4)
## Warning: package 'ade4' was built under R version 4.3.3
# Matriz R (Ambiente): 15 sÃtios x 4 variáveis
set.seed(42) # Para reprodutibilidade
temperatura <- seq(15, 25, length.out = 15) + rnorm(15, 0, 1)
oxigenio <- seq(10, 5, length.out = 15) + rnorm(15, 0, 0.5)
turbidez <- cut(temperatura, breaks = c(14, 18, 22, 26), labels = c("Baixa", "Media", "Alta"))
classificacao_site <- c(rep("Cabeceira", 5), rep("Medio", 5), rep("Baixo_Curso", 5))
# Criar o dataframe R
tabR <- data.frame(
Temperatura_Agua = round(temperatura, 2),
Oxigenio_Dissolvido = round(oxigenio, 2),
Turbidez = as.factor(turbidez),
Classificacao_Site = as.factor(classificacao_site)
)
row.names(tabR) <- paste0("Sitio_", 1:15)
# Matriz Q (Atributos): 10 espécies x 4 atributos
especies <- paste0("Especie_", 1:10)
tabQ <- data.frame(
Comprimento_Medio_cm = c(20, 15, 30, 10, 45, 25, 12, 35, 18, 50),
Dieta = as.factor(c("Carnivora", "Onivora", "Herbivora", "Onivora", "Carnivora", "Onivora", "Herbivora", "Carnivora", "Herbivora", "Onivora")),
Tolerancia_Oxigenio = as.factor(c("Alta", "Media", "Baixa", "Media", "Baixa", "Alta", "Alta", "Baixa", "Media", "Media")),
Indice_Forma_Corpo = c(1.5, 1.2, 2.0, 1.0, 2.5, 1.8, 1.3, 2.2, 1.1, 1.9)
)
row.names(tabQ) <- especies
# Matriz L (Abundância): 15 sÃtios x 10 espécies
# Distribuição baseada em tolerância e comprimento (maior comprimento em águas mais quentes)
# Especie_1 (Tol. Alta, Comp. Medio): mais abundante em sitios de baixo oxigênio
# Especie_2 (Tol. Media, Comp. Medio)
# Especie_3 (Tol. Baixa, Comp. Alto): mais abundante em sitios de alto oxigênio
tabL <- matrix(0, nrow = 15, ncol = 10)
colnames(tabL) <- especies
set.seed(123)
for (i in 1:15) {
# SÃtios 1-5 (cabeceira) - preferência por Tolerancia_Baixa
if (i <= 5) {
tabL[i, c(3, 5, 8)] <- rpois(3, lambda = 10)
tabL[i, c(1, 2, 4, 6, 7, 9, 10)] <- rpois(7, lambda = 2)
}
# SÃtios 6-10 (medio) - preferência por Tolerancia_Media
else if (i > 5 && i <= 10) {
tabL[i, c(2, 4, 9, 10)] <- rpois(4, lambda = 10)
tabL[i, c(1, 3, 5, 6, 7, 8)] <- rpois(6, lambda = 2)
}
# SÃtios 11-15 (baixo curso) - preferência por Tolerancia_Alta
else {
tabL[i, c(1, 6, 7)] <- rpois(3, lambda = 10)
tabL[i, c(2, 3, 4, 5, 8, 9, 10)] <- rpois(7, lambda = 2)
}
# Ajustar a abundância com base na dieta e turbidez (e.g., HerbÃvoros em turbidez alta)
if (tabR$Turbidez[i] == "Alta") {
tabL <- tabL + rpois(2, 5)
}
}
tabL <- as.data.frame(tabL)
A análise de RLQ no R é realizada em três etapas: pré-análises das
matrizes R, L e Q, e então a
execução da função rlq(), que sintetiza os
resultados.[16]
# L (abundância): Análise de Correspondência (CA)
dudi_L <- dudi.coa(tabL, scannf = FALSE)
summary(dudi_L)
## Class: coa dudi
## Call: dudi.coa(df = tabL, scannf = FALSE)
##
## Total inertia: 0.02211
##
## Eigenvalues:
## Ax1 Ax2 Ax3 Ax4 Ax5
## 0.0101071 0.0072080 0.0028818 0.0008441 0.0004016
##
## Projected inertia (%):
## Ax1 Ax2 Ax3 Ax4 Ax5
## 45.704 32.594 13.031 3.817 1.816
##
## Cumulative projected inertia (%):
## Ax1 Ax1:2 Ax1:3 Ax1:4 Ax1:5
## 45.70 78.30 91.33 95.15 96.96
##
## (Only 5 dimensions (out of 9) are shown)
# R (ambiente): PCA 'dudi.coa' para as variáveis quantitativas e Hill-Smith para dados mistos
dudi_R <- dudi.hillsmith(tabR, scannf = FALSE, row.w = dudi_L$lw)
summary(dudi_R)
## Class: mix dudi
## Call: dudi.hillsmith(df = tabR, row.w = dudi_L$lw, scannf = FALSE)
##
## Total inertia: 6
##
## Eigenvalues:
## Ax1 Ax2 Ax3 Ax4 Ax5
## 3.57573 1.69358 0.33333 0.25938 0.08556
##
## Projected inertia (%):
## Ax1 Ax2 Ax3 Ax4 Ax5
## 59.596 28.226 5.556 4.323 1.426
##
## Cumulative projected inertia (%):
## Ax1 Ax1:2 Ax1:3 Ax1:4 Ax1:5
## 59.60 87.82 93.38 97.70 99.13
##
## (Only 5 dimensions (out of 6) are shown)
# Q (atributos): PCA para as variáveis quantitativas e Hill-Smith para dados mistos
dudi_Q <- dudi.pca(tabQ[, c("Comprimento_Medio_cm", "Indice_Forma_Corpo")], scannf = FALSE, row.w = dudi_L$cw)
summary(dudi_Q)
## Class: pca dudi
## Call: dudi.pca(df = tabQ[, c("Comprimento_Medio_cm", "Indice_Forma_Corpo")],
## row.w = dudi_L$cw, scannf = FALSE)
##
## Total inertia: 2
##
## Eigenvalues:
## Ax1 Ax2
## 1.8609 0.1391
##
## Projected inertia (%):
## Ax1 Ax2
## 93.043 6.957
##
## Cumulative projected inertia (%):
## Ax1 Ax1:2
## 93.04 100.00
# rlq() usa os objetos dudi das pré-análises.
rlq_result <- rlq(dudi_R, dudi_L, dudi_Q, scannf = FALSE)
summary(rlq_result)
## RLQ analysis
##
## Class: rlq dudi
## Call: rlq(dudiR = dudi_R, dudiL = dudi_L, dudiQ = dudi_Q, scannf = FALSE)
##
## Total inertia: 0.02007
##
## Eigenvalues:
## Ax1 Ax2
## 0.0193234 0.0007452
##
## Projected inertia (%):
## Ax1 Ax2
## 96.287 3.713
##
## Cumulative projected inertia (%):
## Ax1 Ax1:2
## 96.29 100.00
##
##
## Eigenvalues decomposition:
## eig covar sdR sdQ corr
## 1 0.019323435 0.13900876 1.842425 1.3586948 0.05553034
## 2 0.000745214 0.02729861 1.354044 0.3923625 0.05138307
##
## Inertia & coinertia R (dudi_R):
## inertia max ratio
## 1 3.394531 3.575733 0.9493244
## 12 5.227967 5.269312 0.9921537
##
## Inertia & coinertia Q (dudi_Q):
## inertia max ratio
## 1 1.846052 1.860857 0.9920438
## 12 2.000000 2.000000 1.0000000
##
## Correlation L (dudi_L):
## corr max ratio
## 1 0.05553034 0.10053414 0.5523531
## 2 0.05138307 0.08489973 0.6052207
# Usa permutações para testar a hipótese nula de ausência de ligação entre as matrizes
randtest_rlq <- randtest(rlq_result, nrepet = 999)
print(randtest_rlq)
## class: krandtest lightkrandtest
## Monte-Carlo tests
## Call: randtest.rlq(xtest = rlq_result, nrepet = 999)
##
## Number of tests: 2
##
## Adjustment method for multiple comparisons: none
## Permutation number: 999
## Test Obs Std.Obs Alter Pvalue
## 1 Model 2 0.02006865 5.703285 greater 0.002
## 2 Model 4 0.02006865 2.127222 greater 0.048
plot(rlq_result, sub = "Biplot RLQ (Ambiente e Atributos de Peixes)")
fc_result <- fourthcorner(tabR, tabL, tabQ, modeltype = 6, p.adjust.method.G = "fdr", nrepet = 999)
print(fc_result)
## Fourth-corner Statistics
## ------------------------
## Permutation method Comb. 2 and 4 ( 999 permutations)
##
## Adjustment method for multiple comparisons: holm
## call: fourthcorner(tabR = tabR, tabL = tabL, tabQ = tabQ, modeltype = 6, nrepet = 999, p.adjust.method.G = "fdr")
##
## ---
##
## Test Stat Obs Std.Obs
## 1 Temperatura_Agua / Comprimento_Medio_cm r -0.04440247 -1.9426698
## 2 Oxigenio_Dissolvido / Comprimento_Medio_cm r 0.04471202 1.9404340
## 3 Turbi.Baixa / Comprimento_Medio_cm Homog. 0.31141819 1.2078542
## 4 Turbi.Media / Comprimento_Medio_cm Homog. 0.40363513 1.7545995
## 5 Turbi.Alta / Comprimento_Medio_cm Homog. 0.28306313 -0.9370109
## 6 Class.Baixo_Curso / Comprimento_Medio_cm Homog. 0.20166157 -1.0063336
## 7 Class.Cabeceira / Comprimento_Medio_cm Homog. 0.39107307 1.4553607
## 8 Class.Medio / Comprimento_Medio_cm Homog. 0.40480070 1.7737715
## 9 Temperatura_Agua / Dieta.Carnivora Homog. 0.30324423 1.0912466
## 10 Oxigenio_Dissolvido / Dieta.Carnivora Homog. 0.31019406 1.8045140
## 11 Turbi.Baixa / Dieta.Carnivora N 463.00000000 1.9278416
## 12 Turbi.Media / Dieta.Carnivora N 511.00000000 1.0072798
## 13 Turbi.Alta / Dieta.Carnivora N 397.00000000 -0.3939084
## 14 Class.Baixo_Curso / Dieta.Carnivora N 293.00000000 -0.1107866
## 15 Class.Cabeceira / Dieta.Carnivora N 586.00000000 1.5125267
## 16 Class.Medio / Dieta.Carnivora N 492.00000000 0.6575492
## 17 Temperatura_Agua / Dieta.Herbivora Homog. 0.29963585 -0.7210291
## 18 Oxigenio_Dissolvido / Dieta.Herbivora Homog. 0.31367074 1.7540750
## 19 Turbi.Baixa / Dieta.Herbivora N 438.00000000 1.3741230
## 20 Turbi.Media / Dieta.Herbivora N 537.00000000 1.3708695
## 21 Turbi.Alta / Dieta.Herbivora N 423.00000000 0.6022647
## 22 Class.Baixo_Curso / Dieta.Herbivora N 311.00000000 0.5133120
## 23 Class.Cabeceira / Dieta.Herbivora N 553.00000000 1.7320655
## 24 Class.Medio / Dieta.Herbivora N 534.00000000 1.3209826
## 25 Temperatura_Agua / Dieta.Onivora Homog. 0.39633716 -0.3833203
## 26 Oxigenio_Dissolvido / Dieta.Onivora Homog. 0.37555733 -1.6307643
## 27 Turbi.Baixa / Dieta.Onivora N 551.00000000 0.8688691
## 28 Turbi.Media / Dieta.Onivora N 757.00000000 1.9341753
## 29 Turbi.Alta / Dieta.Onivora N 538.00000000 -0.2193541
## 30 Class.Baixo_Curso / Dieta.Onivora N 386.00000000 -0.3909042
## 31 Class.Cabeceira / Dieta.Onivora N 680.00000000 0.8949033
## 32 Class.Medio / Dieta.Onivora N 780.00000000 1.6526447
## 33 Temperatura_Agua / Toler.Alta Homog. 0.31984024 2.5264620
## 34 Oxigenio_Dissolvido / Toler.Alta Homog. 0.33147048 2.9255534
## 35 Turbi.Baixa / Toler.Alta N 413.00000000 1.4019389
## 36 Turbi.Media / Toler.Alta N 486.00000000 0.7937188
## 37 Turbi.Alta / Toler.Alta N 473.00000000 -2.0301146
## 38 Class.Baixo_Curso / Toler.Alta N 369.00000000 2.9470527
## 39 Class.Cabeceira / Toler.Alta N 517.00000000 1.6591622
## 40 Class.Medio / Toler.Alta N 486.00000000 0.8034640
## 41 Temperatura_Agua / Toler.Baixa Homog. 0.29461130 -0.4220723
## 42 Oxigenio_Dissolvido / Toler.Baixa Homog. 0.29943999 0.1214719
## 43 Turbi.Baixa / Toler.Baixa N 493.00000000 2.1150142
## 44 Turbi.Media / Toler.Baixa N 524.00000000 1.0165203
## 45 Turbi.Alta / Toler.Baixa N 365.00000000 -1.8206199
## 46 Class.Baixo_Curso / Toler.Baixa N 262.00000000 -1.4277952
## 47 Class.Cabeceira / Toler.Baixa N 622.00000000 2.9204081
## 48 Class.Medio / Toler.Baixa N 498.00000000 0.6006748
## 49 Temperatura_Agua / Toler.Media Homog. 0.38055238 -2.0539360
## 50 Oxigenio_Dissolvido / Toler.Media Homog. 0.36404288 -2.3811259
## 51 Turbi.Baixa / Toler.Media N 546.00000000 0.6605033
## 52 Turbi.Media / Toler.Media N 795.00000000 2.1197912
## 53 Turbi.Alta / Toler.Media N 520.00000000 -0.9727624
## 54 Class.Baixo_Curso / Toler.Media N 359.00000000 -1.4611227
## 55 Class.Cabeceira / Toler.Media N 680.00000000 0.7467240
## 56 Class.Medio / Toler.Media N 822.00000000 2.4443194
## 57 Temperatura_Agua / Indice_Forma_Corpo r -0.05006364 -2.1673177
## 58 Oxigenio_Dissolvido / Indice_Forma_Corpo r 0.04440899 1.9044006
## 59 Turbi.Baixa / Indice_Forma_Corpo Homog. 0.32215237 1.4653629
## 60 Turbi.Media / Indice_Forma_Corpo Homog. 0.39774319 1.5761539
## 61 Turbi.Alta / Indice_Forma_Corpo Homog. 0.27728494 -1.6145531
## 62 Class.Baixo_Curso / Indice_Forma_Corpo Homog. 0.19707910 -1.5641589
## 63 Class.Cabeceira / Indice_Forma_Corpo Homog. 0.40643019 1.8022931
## 64 Class.Medio / Indice_Forma_Corpo Homog. 0.39203903 1.4304252
## Alter Pvalue Pvalue.adj
## 1 two-sided 0.038 1
## 2 two-sided 0.039 1
## 3 less 0.864 1
## 4 less 0.976 1
## 5 less 0.196 1
## 6 less 0.185 1
## 7 less 0.919 1
## 8 less 0.98 1
## 9 less 0.848 1
## 10 less 0.96 1
## 11 two-sided 0.039 1
## 12 two-sided 0.338 1
## 13 two-sided 0.661 1
## 14 two-sided 0.835 1
## 15 two-sided 0.133 1
## 16 two-sided 0.524 1
## 17 less 0.257 1
## 18 less 0.953 1
## 19 two-sided 0.157 1
## 20 two-sided 0.169 1
## 21 two-sided 0.568 1
## 22 two-sided 0.547 1
## 23 two-sided 0.074 1
## 24 two-sided 0.19 1
## 25 less 0.36 1
## 26 less 0.052 1
## 27 two-sided 0.422 1
## 28 two-sided 0.045 1
## 29 two-sided 0.8 1
## 30 two-sided 0.675 1
## 31 two-sided 0.39 1
## 32 two-sided 0.142 1
## 33 less 0.99 1
## 34 less 0.993 1
## 35 two-sided 0.148 1
## 36 two-sided 0.47 1
## 37 two-sided 0.017 0.697
## 38 two-sided 0.01 0.6
## 39 two-sided 0.083 1
## 40 two-sided 0.46 1
## 41 less 0.339 1
## 42 less 0.553 1
## 43 two-sided 0.028 1
## 44 two-sided 0.332 1
## 45 two-sided 0.065 1
## 46 two-sided 0.185 1
## 47 two-sided 0.01 0.6
## 48 two-sided 0.565 1
## 49 less 0.019 0.76
## 50 less 0.006 0.384
## 51 two-sided 0.528 1
## 52 two-sided 0.033 1
## 53 two-sided 0.361 1
## 54 two-sided 0.181 1
## 55 two-sided 0.471 1
## 56 two-sided 0.009 0.414
## 57 two-sided 0.027 1
## 58 two-sided 0.055 1
## 59 less 0.925 1
## 60 less 0.954 1
## 61 less 0.018 1
## 62 less 0.026 1
## 63 less 0.974 1
## 64 less 0.925 1
##
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# A função fourthcorner2() oferece uma estatÃstica multivariada e estatÃsticas de correlação.[10]
fc2_result <- fourthcorner2(tabR, tabL, tabQ, modeltype = 6, p.adjust.method.G = "fdr", nrepet = 999)
print(fc2_result)
## Fourth-corner Statistics
## ------------------------
## Permutation method Comb. 2 and 4 ( 999 permutations)
##
## Adjustment method for multiple comparisons: fdr
## call: fourthcorner2(tabR = tabR, tabL = tabL, tabQ = tabQ, modeltype = 6, nrepet = 999, p.adjust.method.G = "fdr")
##
## ---
##
## Test Stat Obs
## 1 Temperatura_Agua / Comprimento_Medio_cm r^2 0.0019715797
## 2 Oxigenio_Dissolvido / Comprimento_Medio_cm r^2 0.0019991651
## 3 Turbidez / Comprimento_Medio_cm Eta^2 0.0018835541
## 4 Classificacao_Site / Comprimento_Medio_cm Eta^2 0.0024646522
## 5 Temperatura_Agua / Dieta Eta^2 0.0007827563
## 6 Oxigenio_Dissolvido / Dieta Eta^2 0.0005778756
## 7 Turbidez / Dieta Chi2/sum(L) 0.0016028764
## 8 Classificacao_Site / Dieta Chi2/sum(L) 0.0035189092
## 9 Temperatura_Agua / Tolerancia_Oxigenio Eta^2 0.0049960848
## 10 Oxigenio_Dissolvido / Tolerancia_Oxigenio Eta^2 0.0050466488
## 11 Turbidez / Tolerancia_Oxigenio Chi2/sum(L) 0.0087282044
## 12 Classificacao_Site / Tolerancia_Oxigenio Chi2/sum(L) 0.0136951692
## 13 Temperatura_Agua / Indice_Forma_Corpo r^2 0.0025063679
## 14 Oxigenio_Dissolvido / Indice_Forma_Corpo r^2 0.0019721580
## 15 Turbidez / Indice_Forma_Corpo Eta^2 0.0028194981
## 16 Classificacao_Site / Indice_Forma_Corpo Eta^2 0.0044516742
## Std.Obs Alter Pvalue Pvalue.adj
## 1 2.0422428 greater 0.049 0.0871111111111111 .
## 2 2.0747284 greater 0.047 0.0871111111111111 .
## 3 1.0406961 greater 0.148 0.215272727272727
## 4 0.7028300 greater 0.203 0.270666666666667
## 5 -0.3859742 greater 0.546 0.623
## 6 -0.6046252 greater 0.623 0.623
## 7 -0.3306191 greater 0.617 0.623
## 8 0.2124999 greater 0.325 0.4
## 9 3.9380203 greater 0.007 0.0112 *
## 10 4.2226903 greater 0.004 0.00914285714285714 **
## 11 5.7366051 greater 0.001 0.004 **
## 12 5.9166107 greater 0.001 0.004 **
## 13 2.8992751 greater 0.026 0.0832 .
## 14 2.1134674 greater 0.055 0.088 .
## 15 2.2991116 greater 0.041 0.0871111111111111 .
## 16 2.3810326 greater 0.035 0.0871111111111111 .
##
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
plot(fc_result, alpha = 0.05, stat = "D")
plot(fc_result, alpha = 0.05, stat = "D2")
plot(fc_result, alpha = 0.05, stat = "G")