Вспоминаем, что такое непрямая и прямая ординация
Классический подход
PCA
CA
Подход, основанный на трансформации данных
tbPCA — transformation-based PCA
Многомерное шкалирование
PCoA — метрическое многомерное шкалирование
nMDS — неметрическое многомерное шкалирование
Классический подход
RDA
CCA
modified after Fig. 11.4, p.648 in Legendre, Legendre, 2012
Подход, основанный на трансформации данных
tbRDA — transformation-based RDA (Legendre, Gallagher, 2001)
modified after Fig. 11.4, p.648 in Legendre, Legendre, 2012
Подход, основанный на расстояниях
dbRDA — distance-based RDA (Legendre, Anderson, 1999)
Можно использовать RDA для неевклидовых коэффициентов, если при помощи PCoA (Principal coordinate analysis) перевести их в Евклидово пространство.
modified after Fig. 11.4, p.648 in Legendre, Legendre, 2012
...но есть новые для нас элементы
modified after Fig. 11.4, p.648 in Legendre, Legendre, 2012
Что же это значит? В чем проблема с их анализом?
Фрагмент из датасета (Henry et al. 1995).
varespec
— покрытие 44 видов на 24 участках в северной Финляндии и на Кольском полуострове.varechem
— 14 переменных, описывающих условия среды.(В исходном исследовании была еще информация о выпасе оленей)
Какие факторы среды определяют облик растительного сообщества?
Mathew Schwartz, CC BY 3.0, via Wikimedia Commons
Богатые лишайниками сосновые леса на песчаных почвах. Там пасутся полудомашние олени. Выпас скота влияет на растительность много где, здесь тоже.
nMDS: мхи и лишайники на противоположных концах ординации. Высокая пастбищная нагрузка - в середине.
library("ggplot2")theme_set(theme_minimal(base_size = 18))library("cowplot")library("vegan")
## Loading required package: permute
## Loading required package: lattice
## This is vegan 2.6-2
data("varespec")data("varechem")head(varespec, 2)
## Callvulg Empenigr Rhodtome Vaccmyrt Vaccviti Pinusylv Descflex## 18 0.55 11.13 0 0.00 17.80 0.07 0## 15 0.67 0.17 0 0.35 12.13 0.12 0## Betupube Vacculig Diphcomp Dicrsp Dicrfusc Dicrpoly Hylosple## 18 0 1.6 2.07 0.00 1.62 0.00 0## 15 0 0.0 0.00 0.33 10.92 0.02 0## Pleuschr Polypili Polyjuni Polycomm Pohlnuta Ptilcili Barbhatc## 18 4.67 0.02 0.13 0 0.13 0.12 0## 15 37.75 0.02 0.23 0 0.03 0.02 0## Cladarbu Cladrang Cladstel Cladunci Cladcocc Cladcorn Cladgrac## 18 21.73 21.47 3.50 0.30 0.18 0.23 0.25## 15 12.05 8.13 0.18 2.65 0.13 0.18 0.23## Cladfimb Cladcris Cladchlo Cladbotr Cladamau Cladsp Cetreric## 18 0.25 0.23 0 0 0.08 0.02 0.02## 15 0.25 1.23 0 0 0.00 0.00 0.15## Cetrisla Flavniva Nepharct Stersp Peltapht Icmaeric Cladcerv## 18 0.00 0.12 0.02 0.62 0.02 0 0## 15 0.03 0.00 0.00 0.85 0.00 0 0## Claddefo Cladphyl## 18 0.25 0## 15 1.00 0
sum(is.na(varespec))
## [1] 0
Сделайте PCA данных о составе сообщества
Сколько изменчивости объясняют первые две главные компоненты?
Нарисуйте график ординации
mod_pca <- rda(varespec)eigenvals(mod_pca)/sum(eigenvals(mod_pca))*100
## PC1 PC2 PC3 PC4 PC5 PC6 PC7 PC8 PC9 PC10 PC11 ## 53.84 25.43 7.24 4.05 2.65 2.03 1.41 1.08 0.67 0.57 0.51 ## PC12 PC13 PC14 PC15 PC16 PC17 PC18 PC19 PC20 PC21 PC22 ## 0.15 0.13 0.08 0.07 0.04 0.02 0.01 0.01 0.00 0.00 0.00 ## PC23 ## 0.00
biplot(mod_pca, scaling = 2)
mod_pca <- rda(varespec)eigenvals(mod_pca)/sum(eigenvals(mod_pca))*100
## PC1 PC2 PC3 PC4 PC5 PC6 PC7 PC8 PC9 PC10 PC11 ## 53.84 25.43 7.24 4.05 2.65 2.03 1.41 1.08 0.67 0.57 0.51 ## PC12 PC13 PC14 PC15 PC16 PC17 PC18 PC19 PC20 PC21 PC22 ## 0.15 0.13 0.08 0.07 0.04 0.02 0.01 0.01 0.00 0.00 0.00 ## PC23 ## 0.00
biplot(mod_pca, scaling = 2)
Хорошо заметен “эффект подковы”
Все варианты основаны на выборе иного коэффициента различия вместо Евклидова расстояния:
и где они обитают
Широко известный факт, используется в моделях обилия видов (species-abundance models) (обзор моделей см. в работах He, Legendre, 1996, 2002).
y′=y0.5; y′=y0.25; y′=log(y+c), обычно c=1
Но он не исчез, т.к. не решена проблема двойных нулей.
op <- par(mfrow = c(1, 3), mar = c(4, 4, 1.5, 0.5), cex = 1)mod_pca <- rda(varespec)biplot(mod_pca, scaling = 2, main = "сырые данные")mod_pca <- rda(sqrt(varespec))biplot(mod_pca, scaling = 2, main = "квадратный корень")mod_pca <- rda(log(varespec + 1))biplot(mod_pca, scaling = 2, main = "логарифм")par(op)
Orlóci, 1967 предложил использовать для анализа состава сообществ. Часто использовали в генетике (Cavalli-Sforza, Edwards, 1967).
D3(x1,x2)=√2(1−∑pj=1y1jy2j√∑pj=1y21j∑pj=1y22j)=√∑pj=1(y1j√∑pj=1y21j−y2j√∑pj=1y22j)2 [*]
Fig.7.5 Legendre, Legendre, 2012
0≤D3≤√2
= Евклидово расстояние после нормализации по строкам (вектор, деленный на длину вектора)
[*] — Legendre, Legendre, 2012 (коэффициент D3, формула 7.35, стр. 301).
Legendre, Gallagher, 2001 говорят, что лучше расстояние Хеллингера.
Описал Rao, 1995 (на основе интеграла Хеллингера, Hellinger, 1909)
D17(x1,x2)=√∑pj=1[√y1jy1+√y2jy2+] [*]
0≤D3≤√2
Асимметричный коэффициент (нечувствителен к двойным нулям)
= хордальное расстояние, рассчитанное по корням из обилий видов
[*] — Legendre, Legendre, 2012 (коэффициент D17, формула 7.56, стр. 310)
Fig. 2 in Legendre, Gallagher, 2001
y′ij=yij√∑pj=1y2ij
Тр. хорды + Евклидово расстояние = хордальное расстояние
Fig.7.7 in Legendre, Legendre, 2012
y′ij=√yijyi+
Тр. Хеллингера + Евклидово расстояние = расстояние Хеллингера
by David Zelený
Но не обязательно, он останется, если “длинный градиент”
op <- par(mfrow = c(1, 3), mar = c(4, 4, 1.5, 0.5), cex = 1)mod_pca <- rda(varespec)biplot(mod_pca, scaling = 2, main = "сырые данные")mod_pca <- rda(decostand(varespec, method = "normalize"))biplot(mod_pca, scaling = 2, main = "хордальное расст.")mod_pca <- rda(decostand(varespec, method = "hellinger"))biplot(mod_pca, scaling = 2, main = "расст. Хеллингера")par(op)
Учимся использовать неевклидовы меры различий в ординации
Gower, 1966
= метрическое многомерное шкалирование, классическое шкалирование
Цель: создать Евклидово изображение неевклидова пространства, сохраняя отношения между объектами.
Потенциально можно использовать любую меру различий, даже неевклидову.
Хорошо работает, если исходный коэффициент метрический (выполняется неравенство треугольника). Если неметрический — могут быть проблемы.
Матрицу коэффициентов различия D=[Dhi] преобразуем в матрицу A=[ahi]: ahi=−12D2hi
Центрируем матрицу A методом Говера, чтобы получить матрицу Δ1=[δhi]: δhi=ahi−ˉah−ˉai+ˉa
В виде матриц это можно записать так: Δ1=(I−11′n)A(I−11′n),
Спектральное разложение Говеровски-центрированной матрицы Δ1:
Собственные векторы умножаются на корень из их собственных чисел. Минимум одно собственное число равно нулю (т.к. Δ1 центрирована).
Исходные переменные можно проецировать в пространство ординации.
После масштабирования собственные векторы длиной квадратный корень из их собственных чисел √u′kuk=√λk.
Исходные переменные не используются в PCA, но их можно спроецировать в пространство ординации. Spc=1(n−1)Y′cYst Uproj=√n−1SpcΛ−0.5 Yc - центрированная матрица данных (или объясняющих переменных). ЕЕ нужно стандартизовать, если переменные в разных шкалах. Может содержать любой набор вспомогательных количественных данных. Ust - Матрица собственных векторов PCoA или ее кусочек (стандартизована по столбцам). Spc - матрица ковариаций Y и Ust Uproj - строки матрицы - это p переменных, которые нужно добавить на биплот, столбцы - это координаты.
##d_eucl <- vegdist(varespec, method = "euclidean")mod_pcoa_eucl <- cmdscale(d_eucl, k = nrow(varespec) - 1, eig = TRUE)ordiplot(mod_pcoa_eucl, type = "t")
## species scores not available
#varespec_norm <- decostand(varespec, "normalize")d_chord <- vegdist(varespec_norm, method = "euclidean")mod_pcoa_chord <- cmdscale(d_chord, k = nrow(varespec) - 1, eig = TRUE)ordiplot(mod_pcoa_chord, type = "t")
## species scores not available
#varespec_hel <- decostand(varespec, "hellinger")d_hel <- vegdist(varespec_hel, method = "euclidean")mod_pcoa_hel <- cmdscale(d_hel, k = nrow(varespec) - 1, eig = TRUE)ordiplot(mod_pcoa_hel, type = "t")
## species scores not available
d_bray <- vegdist(varespec, method = "bray")mod_pcoa_bray <- cmdscale(d_bray, k = nrow(varespec) - 1, eig = TRUE)
## Warning in cmdscale(d_bray, k = nrow(varespec) - 1, eig = TRUE): only## 15 of the first 23 eigenvalues are > 0
ordiplot(mod_pcoa_bray, type = "t")
## species scores not available
Получите собственные числа из анализа PCoA по матрице коэффициентов Брея-Куртиса.
Посмотрите на них внимательно. Что в них странного?
eigenvals(mod_pcoa_bray)
## [1] 1.7552 1.1334 0.4429## [4] 0.3698 0.2454 0.1961## [7] 0.1751 0.1284 0.0972## [10] 0.0760 0.0637 0.0583## [13] 0.0395 0.0173 0.0051## [16] 0.0000 -0.0004 -0.0065## [19] -0.0133 -0.0254 -0.0375## [22] -0.0480 -0.0537 -0.0741
Посмотрите на них внимательно. Что в них странного?
eigenvals(mod_pcoa_bray)
## [1] 1.7552 1.1334 0.4429## [4] 0.3698 0.2454 0.1961## [7] 0.1751 0.1284 0.0972## [10] 0.0760 0.0637 0.0583## [13] 0.0395 0.0173 0.0051## [16] 0.0000 -0.0004 -0.0065## [19] -0.0133 -0.0254 -0.0375## [22] -0.0480 -0.0537 -0.0741
Отрицательные собственные числа!
Что в них плохого и как с ними бороться
Отрицательные собственные числа для более высоких измерений, но хорошее отображение в первых нескольких измерениях.
Метрики — коэффициенты, у которых есть свойства адекватность, позитивность и симметричность, а так же выполняется неравенство треугольника.
Полуметрики — для них не выполняется неравенство треугольника
Неметрики — могут принимать отрицательные значения (не обладают свойством позитивности)
Метрики — коэффициенты, у которых есть свойства адекватность, позитивность и симметричность, а так же выполняется неравенство треугольника.
Полуметрики — для них не выполняется неравенство треугольника
Неметрики — могут принимать отрицательные значения (не обладают свойством позитивности)
Если у коэффициента отсутствуют какие-либо из свойств метрик, то такое пространство не получится изобразить в Евклидовом пространстве. Признаком этого являются отрицательные собственные числа.
Неевклидовы коэффициенты — пространство, описываемое неевклидовым коэффициентом, невозможно описать в Евклидовом пространстве.
Биплоты с разными поправками будут в общих чертах похожи.
Отрицательные собственные числа влияют на вероятность возникновения ошибок I рода в тестах значимости.
Методы коррекции pp. 502-504 in Legendre, Legendre, 2012
Трансформация матрицы различий.
Поправка к матрице различий.
Для некоторых (даже неевклидовых) коэф. различия есть трансформации, которые переводят их в Евклидовы.
Для некоторых (даже неевклидовых) коэф. различия есть трансформации, которые переводят их в Евклидовы.
Пример для свойств коэффициентов сходства.
Коэф. сходства | D=1−S | D=1−S Евклид. |
D=√1−S метрика |
D=√1−S Евклид. |
---|---|---|---|---|
Simple matching | метрика | нет | да | да |
Жаккард | метрика | нет | да | да |
Соренсен | полуметрика | нет | да | да |
Кульчинский | неметрика | нет | нет | нет |
Для некоторых (даже неевклидовых) коэф. различия есть трансформации, которые переводят их в Евклидовы.
А этот пример — для коэффициентов различия.
Коэф. различия | D | D Евклид. |
√D метрика |
√D Евклид. |
---|---|---|---|---|
Евклидово расст. | метрика | да | да | да |
Расст. по Манхеттену | метрика | нет | да | да |
Расст. хорды | метрика | да | да | да |
Хи-квадрат | метрика | да | да | да |
Расст. Хеллингера | метрика | да | да | да |
Коэф Брея-Куртиса | полуметрика | нет | да | да |
Table 7.2 in Legendre, Legendre, 2012
При неевклидовости можно сделать поправку к матрице различий (но не слишком большую):
Caillez correction — добавить константу к суб- и супрадиагональным элементам матрицы различий D.
Завышена вероятность ошибки I рода в ANOVA (Legendre, Anderson, 1999).
Lingoes correction — добавить константу к квадратам суб- и супрадиагональных элементов матрицы различий D.
Несмещенная вероятность ошибки I рода в ANOVA.
see 5.5.1 in Borcard, Legendre, 2018
vegan::cmdscale()
И эта поправка — единственная в cmdscale()
d_bray <- vegdist(varespec, method = "bray")mod_pcoa_bray <- cmdscale(d_bray, k = nrow(varespec) - 1, eig = TRUE)eigenvals(mod_pcoa_bray)
## [1] 1.7552 1.1334 0.4429 0.3698 0.2454 0.1961 0.1751 0.1284## [9] 0.0972 0.0760 0.0637 0.0583 0.0395 0.0173 0.0051 0.0000## [17] -0.0004 -0.0065 -0.0133 -0.0254 -0.0375 -0.0480 -0.0537 -0.0741
d_bray <- vegdist(varespec, method = "bray")mod_pcoa_bray_cai <- cmdscale(d_bray, k = nrow(varespec) - 1, eig = TRUE, add = TRUE) # <<-eigenvals(mod_pcoa_bray_cai)
## [1] 2.6382 1.7634 0.7727 0.6529 0.4733 0.4214 0.3712 0.2990## [9] 0.2532 0.2076 0.1932 0.1876 0.1498 0.1112 0.0981 0.0924## [17] 0.0806 0.0684 0.0434 0.0352 0.0306 0.0209 0.0000 0.0000
Нанесем на график взвешенные средние видов.
ordiplot(scores(mod_pcoa_bray_cai, choices = c(1, 2)), type = "t")abline(h = 0, lty = 1, lwd = 0.5)abline(v = 0, lty = 1, lwd = 0.5)# Взвешенные средние видовvarespec_wa <- wascores(mod_pcoa_bray_cai$points[, 1:2], varespec)text(varespec_wa, rownames(varespec_wa), cex = 0.7, col = "red")
Нанесите на график ординации проекции переменных среды при помощи envfit()
.
Используйте только переменные, значимо связанные со структурой сообществ.
На график нанесены взвешенные средние видов и проекции переменных среды.
ordiplot(scores(mod_pcoa_bray_cai, choices = c(1, 2)), type = "t")abline(h = 0, lty = 1, lwd = 0.5)abline(v = 0, lty = 1, lwd = 0.5)# Взвешенные средние видовvarespec_wa <- wascores(mod_pcoa_bray_cai$points[, 1:2], varespec)text(varespec_wa, rownames(varespec_wa), cex = 0.7, col = "red")# Решение 3 -----------------------------------------------------# Проекции переменных среды ->> таблицаmod_pcoa_bray_cai_env <- envfit(mod_pcoa_bray_cai, varechem)# Значимые наносим на графикplot(mod_pcoa_bray_cai_env, p.max = 0.05, col = "darkviolet")# --------------------------------------------------------------
mod_pcoa_bray_cai_env
## ## ***VECTORS## ## Dim1 Dim2 r2 Pr(>r) ## N 0.135 0.991 0.23 0.059 . ## P 0.487 -0.873 0.27 0.032 * ## K 0.726 -0.687 0.16 0.158 ## Ca 0.685 -0.729 0.35 0.008 ** ## Mg 0.726 -0.687 0.28 0.027 * ## S 0.211 -0.977 0.11 0.292 ## Al -0.987 0.159 0.52 0.002 ** ## Fe -0.974 0.225 0.46 0.001 ***## Mn 0.933 -0.360 0.44 0.004 ** ## Zn 0.761 -0.649 0.19 0.114 ## Mo -0.706 0.708 0.05 0.590 ## Baresoil 0.950 0.312 0.25 0.046 * ## Humdepth 0.914 -0.405 0.45 0.003 ** ## pH -0.992 -0.129 0.24 0.057 . ## ---## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1## Permutation: free## Number of permutations: 999
ape::pcoa()
library(ape) # здесь есть обе поправки к PCoAd_bray <- vegdist(varespec, method = "bray")
mod_pcoa_raw <- pcoa(d_bray)mod_pcoa_raw$values$Eigenvalues
## [1] 1.7552165 1.1334455 0.4429018## [4] 0.3698054 0.2453532 0.1960921## [7] 0.1751131 0.1284467 0.0971594## [10] 0.0759601 0.0637178 0.0583225## [13] 0.0394934 0.0172699 0.0051011## [16] 0.0000000 -0.0004131 -0.0064654## [19] -0.0133147 -0.0253944 -0.0375105## [22] -0.0480069 -0.0537146 -0.0741390
biplot.pcoa(mod_pcoa_raw, varespec)
mod_pcoa_cai <- pcoa(d_bray, correction = "cailliez")mod_pcoa_cai$values$Corr_eig
## [1] 2.63820 1.76344 0.77272## [4] 0.65286 0.47325 0.42136## [7] 0.37118 0.29904 0.25324## [10] 0.20761 0.19322 0.18756## [13] 0.14980 0.11123 0.09814## [16] 0.09244 0.08057 0.06839## [19] 0.04338 0.03522 0.03057## [22] 0.02086 0.00000 0.00000
biplot.pcoa(mod_pcoa_cai, varespec)
mod_pcoa_lin <- pcoa(d_bray, correction = "lingoes")mod_pcoa_lin$values$Corr_eig
## [1] 1.82936 1.20758 0.51704## [4] 0.44394 0.31949 0.27023## [7] 0.24925 0.20259 0.17130## [10] 0.15010 0.13786 0.13246## [13] 0.11363 0.09141 0.07924## [16] 0.07373 0.06767 0.06082## [19] 0.04874 0.03663 0.02613## [22] 0.02042 0.00000 0.00000
biplot.pcoa(mod_pcoa_lin, varespec)
PCA
PCoA
CA
nMDS
RDA по трансформированным данным
# ordiggplot Рисует график ординации из vegan в ggplotordiggplot <- function(mod, lab_size = 5, lab_var_size = 6, line_size = 0.5, point_size = 2, plot_sites = TRUE, plot_species = TRUE, plot_centroids = TRUE, plot_biplot = TRUE, plot_factorbiplot = TRUE, ...){ mod_dat <- scores(mod, tidy = TRUE, ...) ax_names <- colnames(mod_dat)[1:2] names(mod_dat)[1:2] <- c("X", "Y") mod_eig <- round(eigenvals(mod) / mod$tot.chi * 100, 2) ar <- arrow(angle = 10, length = unit(2, "mm"), type = "closed") gg <- ggplot() + geom_hline(yintercept = 0, colour = "grey70", size = 0.25) + geom_vline(xintercept = 0, colour = "grey70", size = 0.25) if(any(mod_dat$score == "sites" & plot_sites)) { gg <- gg + geom_point(data = filter(mod_dat, score == "sites"), aes(x = X, y = Y), size = point_size) + geom_text(data = filter(mod_dat, score == "sites"), aes(x = X, y = Y, label = label), size = lab_size, hjust = -0.7, colour = "grey40") } if(any(mod_dat$score == "species" & plot_species)) { gg <- gg + geom_segment(data = filter(mod_dat, score == "species"), aes(x = 0, y = 0, xend = X, yend = Y), size = line_size, colour = "orangered", arrow = ar) + geom_text(data = filter(mod_dat, score == "species"), aes(x = X, y = Y, label = label), size = lab_size, hjust = 1.3, vjust = 0.4, colour = "orangered") } if(any(mod_dat$score == "centroids" & plot_centroids)) { gg <- gg + geom_point(data = filter(mod_dat, score == "centroids"), aes(x = X, y = Y), shape = 13, size = 3, colour = "grey20") + geom_text(data = filter(mod_dat, score == "centroids"), aes(x = X, y = Y, label = label), size = lab_var_size, hjust = -0.2, colour = "grey20") } if(any(mod_dat$score == "factorbiplot" & plot_factorbiplot)) { gg <- gg + geom_point(data = filter(mod_dat, score == "factorbiplot"), aes(x = X, y = Y), shape = 19, size = 0.5, colour = "blue") + geom_text(data = filter(mod_dat, score == "factorbiplot"), aes(x = X, y = Y, label = label), size = lab_var_size, hjust = -0.2, colour = "blue") } if(any(mod_dat$score == "biplot" & plot_biplot)) { gg <- gg + geom_segment(data = filter(mod_dat, score == "biplot"), aes(x = 0, y = 0, xend = X, yend = Y), size = line_size, colour = "blue", arrow = ar) + geom_text(data = filter(mod_dat, score == "biplot"), aes(x = X, y = Y, label = label), size = lab_var_size, hjust = -0.2, colour = "blue") } gg + coord_cartesian() + labs(x = paste0(ax_names[1], " (", mod_eig[1], "%)"), y = paste0(ax_names[2], " (", mod_eig[2], "%)")) }
mod_tbrda <- rda(decostand(varespec, method = 'hellinger') ~ Mn + Baresoil + N, data = varechem)eigenvals(mod_tbrda)/sum(eigenvals(mod_tbrda))
## RDA1 RDA2 RDA3 PC1 PC2 PC3 PC4 PC5 ## 0.21529 0.07364 0.03424 0.22379 0.14284 0.07402 0.05034 0.04629 ## PC6 PC7 PC8 PC9 PC10 PC11 PC12 PC13 ## 0.02925 0.02751 0.02027 0.01602 0.01328 0.00973 0.00641 0.00517 ## PC14 PC15 PC16 PC17 PC18 PC19 PC20 ## 0.00351 0.00265 0.00166 0.00161 0.00120 0.00087 0.00039
# ordiggplot(mod_tbrda, scaling = 1)ordiggplot(mod_tbrda, scaling = 2) + aes(colour = varechem$Mn)
anova(mod_tbrda, by = "mar")
## Permutation test for rda under reduced model## Marginal effects of terms## Permutation: free## Number of permutations: 999## ## Model: rda(formula = decostand(varespec, method = "hellinger") ~ Mn + Baresoil + N, data = varechem)## Df Variance F Pr(>F) ## Mn 1 0.0492 3.99 0.004 **## Baresoil 1 0.0303 2.46 0.036 * ## N 1 0.0225 1.83 0.112 ## Residual 20 0.2468 ## ---## Signif. codes: ## 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Карт-бланш (ну, почти) на коэффициенты различия
Используется для анализа “неевклидовых” матриц различия
Для количественных признаков:
Для бинарных признаков:
Для других типов данных:
Legendre, Legendre, 2012
vegan
Классический вариант
(Legendre, Anderson, 1999)
vegan::capscale()
— смещенная вероятность ошибки I рода в многофакторных ANOVA.
add = "cailliez"
add = "lingoes"
Новый вариант
(McArdle, Anderson, 2001)
vegan::dbRDA()
— правильная вероятность ошибки I рода в многофакторных ANOVA.
mod_dbrda_lingoes <- capscale(varespec ~ Mn + Baresoil + N, distance = "bray", data = varechem, add = TRUE)eigenvals(mod_dbrda_lingoes)/sum(eigenvals(mod_dbrda_lingoes))
## CAP1 CAP2 CAP3 MDS1 MDS2 MDS3 MDS4 MDS5 ## 0.16464 0.07210 0.05017 0.16860 0.13427 0.07332 0.05147 0.04711 ## MDS6 MDS7 MDS8 MDS9 MDS10 MDS11 MDS12 MDS13 ## 0.03875 0.03134 0.02587 0.02299 0.02057 0.01895 0.01589 0.01378 ## MDS14 MDS15 MDS16 MDS17 MDS18 MDS19 MDS20 ## 0.01259 0.01080 0.00971 0.00668 0.00573 0.00339 0.00128
# ordiggplot(mod_dbrda_lingoes, scaling = 1)ordiggplot(mod_dbrda_lingoes, scaling = 2) + aes(colour = varechem$Mn)
anova(mod_dbrda_lingoes, by = "mar")
## Permutation test for capscale under reduced model## Marginal effects of terms## Permutation: free## Number of permutations: 999## ## Model: capscale(formula = varespec ~ Mn + Baresoil + N, data = varechem, distance = "bray", add = TRUE)## Df SumOfSqs F Pr(>F) ## Mn 1 0.70 3.16 0.003 **## Baresoil 1 0.51 2.29 0.026 * ## N 1 0.42 1.91 0.050 * ## Residual 20 4.46 ## ---## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Данные, описывающие состав сообщества:
В силу этих свойств:
Данные, описывающие состав сообщества:
В силу этих свойств:
Экологические данные можно трансформировать:
Данные, описывающие состав сообщества:
В силу этих свойств:
Экологические данные можно трансформировать:
PCoA позволяет изобразить пространство любого коэффициента в Евклидовом пространстве. Но, чтобы в ANOVA были правильные вероятности ошибок I рода, не должно быть отрицательных собственных чисел (есть поправки).
Данные из Borcard et al., 2011, исходно из PhD диссертации Verneaux (1973).
Verneaux (1973) предложил использовать сообщества рыб в качестве индикаторов состояния рек и ручьев.
doubs$fish
— Обилие 27 видов рыб в 30 точках на реке Дуdoubs$env
— 11 характеристик условий средыdoubs$xy
— Координаты точекПроанализируйте, какие факторы среды определяют облик сообществ рыб в реке Ду, если удалить влияние географической близости точек сбора.
data("doubs", package = "ade4")help("doubs", package = "ade4")
Schaffhausen, Public domain, via Wikimedia Commons
Река Ду - приток Соны. Находится на юго-востоке Франции (Бургундия) и западе Швейцарии. Исток в горах Юра.
По итогам диссертации Верно предложил классифицировать на 4 зоны:
Verneaux, J. (1973) Cours d’eau de Franche-Comté (Massif du Jura). Recherches écologiques sur le réseau hydrographique du Doubs. Essai de biotypologie. Thèse d’état, Besançon. 1–257.
Borcard, D., Gillet, F. & Legendre, P. (2011) Numerical Ecology with R. Springer, UseR! Edition.
Keyboard shortcuts
↑, ←, Pg Up, k | Go to previous slide |
↓, →, Pg Dn, Space, j | Go to next slide |
Home | Go to first slide |
End | Go to last slide |
Number + Return | Go to specific slide |
b / m / f | Toggle blackout / mirrored / fullscreen mode |
c | Clone slideshow |
p | Toggle presenter mode |
t | Restart the presentation timer |
?, h | Toggle this help |
o | Tile View: Overview of Slides |
s | Toggle scribble toolbox |
Esc | Back to slideshow |
Вспоминаем, что такое непрямая и прямая ординация
Классический подход
PCA
CA
Подход, основанный на трансформации данных
tbPCA — transformation-based PCA
Многомерное шкалирование
PCoA — метрическое многомерное шкалирование
nMDS — неметрическое многомерное шкалирование
Классический подход
RDA
CCA
modified after Fig. 11.4, p.648 in Legendre, Legendre, 2012
Подход, основанный на трансформации данных
tbRDA — transformation-based RDA (Legendre, Gallagher, 2001)
modified after Fig. 11.4, p.648 in Legendre, Legendre, 2012
Подход, основанный на расстояниях
dbRDA — distance-based RDA (Legendre, Anderson, 1999)
Можно использовать RDA для неевклидовых коэффициентов, если при помощи PCoA (Principal coordinate analysis) перевести их в Евклидово пространство.
modified after Fig. 11.4, p.648 in Legendre, Legendre, 2012
...но есть новые для нас элементы
modified after Fig. 11.4, p.648 in Legendre, Legendre, 2012
Что же это значит? В чем проблема с их анализом?
Фрагмент из датасета (Henry et al. 1995).
varespec
— покрытие 44 видов на 24 участках в северной Финляндии и на Кольском полуострове.varechem
— 14 переменных, описывающих условия среды.(В исходном исследовании была еще информация о выпасе оленей)
Какие факторы среды определяют облик растительного сообщества?
Mathew Schwartz, CC BY 3.0, via Wikimedia Commons
Богатые лишайниками сосновые леса на песчаных почвах. Там пасутся полудомашние олени. Выпас скота влияет на растительность много где, здесь тоже.
nMDS: мхи и лишайники на противоположных концах ординации. Высокая пастбищная нагрузка - в середине.
library("ggplot2")theme_set(theme_minimal(base_size = 18))library("cowplot")library("vegan")
## Loading required package: permute
## Loading required package: lattice
## This is vegan 2.6-2
data("varespec")data("varechem")head(varespec, 2)
## Callvulg Empenigr Rhodtome Vaccmyrt Vaccviti Pinusylv Descflex## 18 0.55 11.13 0 0.00 17.80 0.07 0## 15 0.67 0.17 0 0.35 12.13 0.12 0## Betupube Vacculig Diphcomp Dicrsp Dicrfusc Dicrpoly Hylosple## 18 0 1.6 2.07 0.00 1.62 0.00 0## 15 0 0.0 0.00 0.33 10.92 0.02 0## Pleuschr Polypili Polyjuni Polycomm Pohlnuta Ptilcili Barbhatc## 18 4.67 0.02 0.13 0 0.13 0.12 0## 15 37.75 0.02 0.23 0 0.03 0.02 0## Cladarbu Cladrang Cladstel Cladunci Cladcocc Cladcorn Cladgrac## 18 21.73 21.47 3.50 0.30 0.18 0.23 0.25## 15 12.05 8.13 0.18 2.65 0.13 0.18 0.23## Cladfimb Cladcris Cladchlo Cladbotr Cladamau Cladsp Cetreric## 18 0.25 0.23 0 0 0.08 0.02 0.02## 15 0.25 1.23 0 0 0.00 0.00 0.15## Cetrisla Flavniva Nepharct Stersp Peltapht Icmaeric Cladcerv## 18 0.00 0.12 0.02 0.62 0.02 0 0## 15 0.03 0.00 0.00 0.85 0.00 0 0## Claddefo Cladphyl## 18 0.25 0## 15 1.00 0
sum(is.na(varespec))
## [1] 0
Сделайте PCA данных о составе сообщества
Сколько изменчивости объясняют первые две главные компоненты?
Нарисуйте график ординации
mod_pca <- rda(varespec)eigenvals(mod_pca)/sum(eigenvals(mod_pca))*100
## PC1 PC2 PC3 PC4 PC5 PC6 PC7 PC8 PC9 PC10 PC11 ## 53.84 25.43 7.24 4.05 2.65 2.03 1.41 1.08 0.67 0.57 0.51 ## PC12 PC13 PC14 PC15 PC16 PC17 PC18 PC19 PC20 PC21 PC22 ## 0.15 0.13 0.08 0.07 0.04 0.02 0.01 0.01 0.00 0.00 0.00 ## PC23 ## 0.00
biplot(mod_pca, scaling = 2)
mod_pca <- rda(varespec)eigenvals(mod_pca)/sum(eigenvals(mod_pca))*100
## PC1 PC2 PC3 PC4 PC5 PC6 PC7 PC8 PC9 PC10 PC11 ## 53.84 25.43 7.24 4.05 2.65 2.03 1.41 1.08 0.67 0.57 0.51 ## PC12 PC13 PC14 PC15 PC16 PC17 PC18 PC19 PC20 PC21 PC22 ## 0.15 0.13 0.08 0.07 0.04 0.02 0.01 0.01 0.00 0.00 0.00 ## PC23 ## 0.00
biplot(mod_pca, scaling = 2)
Хорошо заметен “эффект подковы”
Все варианты основаны на выборе иного коэффициента различия вместо Евклидова расстояния:
и где они обитают
Широко известный факт, используется в моделях обилия видов (species-abundance models) (обзор моделей см. в работах He, Legendre, 1996, 2002).
y′=y0.5; y′=y0.25; y′=log(y+c), обычно c=1
Но он не исчез, т.к. не решена проблема двойных нулей.
op <- par(mfrow = c(1, 3), mar = c(4, 4, 1.5, 0.5), cex = 1)mod_pca <- rda(varespec)biplot(mod_pca, scaling = 2, main = "сырые данные")mod_pca <- rda(sqrt(varespec))biplot(mod_pca, scaling = 2, main = "квадратный корень")mod_pca <- rda(log(varespec + 1))biplot(mod_pca, scaling = 2, main = "логарифм")par(op)
Orlóci, 1967 предложил использовать для анализа состава сообществ. Часто использовали в генетике (Cavalli-Sforza, Edwards, 1967).
D3(x1,x2)=√2(1−∑pj=1y1jy2j√∑pj=1y21j∑pj=1y22j)=√∑pj=1(y1j√∑pj=1y21j−y2j√∑pj=1y22j)2 [*]
Fig.7.5 Legendre, Legendre, 2012
0≤D3≤√2
= Евклидово расстояние после нормализации по строкам (вектор, деленный на длину вектора)
[*] — Legendre, Legendre, 2012 (коэффициент D3, формула 7.35, стр. 301).
Legendre, Gallagher, 2001 говорят, что лучше расстояние Хеллингера.
Описал Rao, 1995 (на основе интеграла Хеллингера, Hellinger, 1909)
D17(x1,x2)=√∑pj=1[√y1jy1+√y2jy2+] [*]
0≤D3≤√2
Асимметричный коэффициент (нечувствителен к двойным нулям)
= хордальное расстояние, рассчитанное по корням из обилий видов
[*] — Legendre, Legendre, 2012 (коэффициент D17, формула 7.56, стр. 310)
Fig. 2 in Legendre, Gallagher, 2001
y′ij=yij√∑pj=1y2ij
Тр. хорды + Евклидово расстояние = хордальное расстояние
Fig.7.7 in Legendre, Legendre, 2012
y′ij=√yijyi+
Тр. Хеллингера + Евклидово расстояние = расстояние Хеллингера
by David Zelený
Но не обязательно, он останется, если “длинный градиент”
op <- par(mfrow = c(1, 3), mar = c(4, 4, 1.5, 0.5), cex = 1)mod_pca <- rda(varespec)biplot(mod_pca, scaling = 2, main = "сырые данные")mod_pca <- rda(decostand(varespec, method = "normalize"))biplot(mod_pca, scaling = 2, main = "хордальное расст.")mod_pca <- rda(decostand(varespec, method = "hellinger"))biplot(mod_pca, scaling = 2, main = "расст. Хеллингера")par(op)
Учимся использовать неевклидовы меры различий в ординации
Gower, 1966
= метрическое многомерное шкалирование, классическое шкалирование
Цель: создать Евклидово изображение неевклидова пространства, сохраняя отношения между объектами.
Потенциально можно использовать любую меру различий, даже неевклидову.
Хорошо работает, если исходный коэффициент метрический (выполняется неравенство треугольника). Если неметрический — могут быть проблемы.
Матрицу коэффициентов различия D=[Dhi] преобразуем в матрицу A=[ahi]: ahi=−12D2hi
Центрируем матрицу A методом Говера, чтобы получить матрицу Δ1=[δhi]: δhi=ahi−ˉah−ˉai+ˉa
В виде матриц это можно записать так: Δ1=(I−11′n)A(I−11′n),
Спектральное разложение Говеровски-центрированной матрицы Δ1:
Собственные векторы умножаются на корень из их собственных чисел. Минимум одно собственное число равно нулю (т.к. Δ1 центрирована).
Исходные переменные можно проецировать в пространство ординации.
После масштабирования собственные векторы длиной квадратный корень из их собственных чисел √u′kuk=√λk.
Исходные переменные не используются в PCA, но их можно спроецировать в пространство ординации. Spc=1(n−1)Y′cYst Uproj=√n−1SpcΛ−0.5 Yc - центрированная матрица данных (или объясняющих переменных). ЕЕ нужно стандартизовать, если переменные в разных шкалах. Может содержать любой набор вспомогательных количественных данных. Ust - Матрица собственных векторов PCoA или ее кусочек (стандартизована по столбцам). Spc - матрица ковариаций Y и Ust Uproj - строки матрицы - это p переменных, которые нужно добавить на биплот, столбцы - это координаты.
##d_eucl <- vegdist(varespec, method = "euclidean")mod_pcoa_eucl <- cmdscale(d_eucl, k = nrow(varespec) - 1, eig = TRUE)ordiplot(mod_pcoa_eucl, type = "t")
## species scores not available
#varespec_norm <- decostand(varespec, "normalize")d_chord <- vegdist(varespec_norm, method = "euclidean")mod_pcoa_chord <- cmdscale(d_chord, k = nrow(varespec) - 1, eig = TRUE)ordiplot(mod_pcoa_chord, type = "t")
## species scores not available
#varespec_hel <- decostand(varespec, "hellinger")d_hel <- vegdist(varespec_hel, method = "euclidean")mod_pcoa_hel <- cmdscale(d_hel, k = nrow(varespec) - 1, eig = TRUE)ordiplot(mod_pcoa_hel, type = "t")
## species scores not available
d_bray <- vegdist(varespec, method = "bray")mod_pcoa_bray <- cmdscale(d_bray, k = nrow(varespec) - 1, eig = TRUE)
## Warning in cmdscale(d_bray, k = nrow(varespec) - 1, eig = TRUE): only## 15 of the first 23 eigenvalues are > 0
ordiplot(mod_pcoa_bray, type = "t")
## species scores not available
Получите собственные числа из анализа PCoA по матрице коэффициентов Брея-Куртиса.
Посмотрите на них внимательно. Что в них странного?
eigenvals(mod_pcoa_bray)
## [1] 1.7552 1.1334 0.4429## [4] 0.3698 0.2454 0.1961## [7] 0.1751 0.1284 0.0972## [10] 0.0760 0.0637 0.0583## [13] 0.0395 0.0173 0.0051## [16] 0.0000 -0.0004 -0.0065## [19] -0.0133 -0.0254 -0.0375## [22] -0.0480 -0.0537 -0.0741
Посмотрите на них внимательно. Что в них странного?
eigenvals(mod_pcoa_bray)
## [1] 1.7552 1.1334 0.4429## [4] 0.3698 0.2454 0.1961## [7] 0.1751 0.1284 0.0972## [10] 0.0760 0.0637 0.0583## [13] 0.0395 0.0173 0.0051## [16] 0.0000 -0.0004 -0.0065## [19] -0.0133 -0.0254 -0.0375## [22] -0.0480 -0.0537 -0.0741
Отрицательные собственные числа!
Что в них плохого и как с ними бороться
Отрицательные собственные числа для более высоких измерений, но хорошее отображение в первых нескольких измерениях.
Метрики — коэффициенты, у которых есть свойства адекватность, позитивность и симметричность, а так же выполняется неравенство треугольника.
Полуметрики — для них не выполняется неравенство треугольника
Неметрики — могут принимать отрицательные значения (не обладают свойством позитивности)
Метрики — коэффициенты, у которых есть свойства адекватность, позитивность и симметричность, а так же выполняется неравенство треугольника.
Полуметрики — для них не выполняется неравенство треугольника
Неметрики — могут принимать отрицательные значения (не обладают свойством позитивности)
Если у коэффициента отсутствуют какие-либо из свойств метрик, то такое пространство не получится изобразить в Евклидовом пространстве. Признаком этого являются отрицательные собственные числа.
Неевклидовы коэффициенты — пространство, описываемое неевклидовым коэффициентом, невозможно описать в Евклидовом пространстве.
Биплоты с разными поправками будут в общих чертах похожи.
Отрицательные собственные числа влияют на вероятность возникновения ошибок I рода в тестах значимости.
Методы коррекции pp. 502-504 in Legendre, Legendre, 2012
Трансформация матрицы различий.
Поправка к матрице различий.
Для некоторых (даже неевклидовых) коэф. различия есть трансформации, которые переводят их в Евклидовы.
Для некоторых (даже неевклидовых) коэф. различия есть трансформации, которые переводят их в Евклидовы.
Пример для свойств коэффициентов сходства.
Коэф. сходства | D=1−S | D=1−S Евклид. |
D=√1−S метрика |
D=√1−S Евклид. |
---|---|---|---|---|
Simple matching | метрика | нет | да | да |
Жаккард | метрика | нет | да | да |
Соренсен | полуметрика | нет | да | да |
Кульчинский | неметрика | нет | нет | нет |
Для некоторых (даже неевклидовых) коэф. различия есть трансформации, которые переводят их в Евклидовы.
А этот пример — для коэффициентов различия.
Коэф. различия | D | D Евклид. |
√D метрика |
√D Евклид. |
---|---|---|---|---|
Евклидово расст. | метрика | да | да | да |
Расст. по Манхеттену | метрика | нет | да | да |
Расст. хорды | метрика | да | да | да |
Хи-квадрат | метрика | да | да | да |
Расст. Хеллингера | метрика | да | да | да |
Коэф Брея-Куртиса | полуметрика | нет | да | да |
Table 7.2 in Legendre, Legendre, 2012
При неевклидовости можно сделать поправку к матрице различий (но не слишком большую):
Caillez correction — добавить константу к суб- и супрадиагональным элементам матрицы различий D.
Завышена вероятность ошибки I рода в ANOVA (Legendre, Anderson, 1999).
Lingoes correction — добавить константу к квадратам суб- и супрадиагональных элементов матрицы различий D.
Несмещенная вероятность ошибки I рода в ANOVA.
see 5.5.1 in Borcard, Legendre, 2018
vegan::cmdscale()
И эта поправка — единственная в cmdscale()
d_bray <- vegdist(varespec, method = "bray")mod_pcoa_bray <- cmdscale(d_bray, k = nrow(varespec) - 1, eig = TRUE)eigenvals(mod_pcoa_bray)
## [1] 1.7552 1.1334 0.4429 0.3698 0.2454 0.1961 0.1751 0.1284## [9] 0.0972 0.0760 0.0637 0.0583 0.0395 0.0173 0.0051 0.0000## [17] -0.0004 -0.0065 -0.0133 -0.0254 -0.0375 -0.0480 -0.0537 -0.0741
d_bray <- vegdist(varespec, method = "bray")mod_pcoa_bray_cai <- cmdscale(d_bray, k = nrow(varespec) - 1, eig = TRUE, add = TRUE) # <<-eigenvals(mod_pcoa_bray_cai)
## [1] 2.6382 1.7634 0.7727 0.6529 0.4733 0.4214 0.3712 0.2990## [9] 0.2532 0.2076 0.1932 0.1876 0.1498 0.1112 0.0981 0.0924## [17] 0.0806 0.0684 0.0434 0.0352 0.0306 0.0209 0.0000 0.0000
Нанесем на график взвешенные средние видов.
ordiplot(scores(mod_pcoa_bray_cai, choices = c(1, 2)), type = "t")abline(h = 0, lty = 1, lwd = 0.5)abline(v = 0, lty = 1, lwd = 0.5)# Взвешенные средние видовvarespec_wa <- wascores(mod_pcoa_bray_cai$points[, 1:2], varespec)text(varespec_wa, rownames(varespec_wa), cex = 0.7, col = "red")
Нанесите на график ординации проекции переменных среды при помощи envfit()
.
Используйте только переменные, значимо связанные со структурой сообществ.
На график нанесены взвешенные средние видов и проекции переменных среды.
ordiplot(scores(mod_pcoa_bray_cai, choices = c(1, 2)), type = "t")abline(h = 0, lty = 1, lwd = 0.5)abline(v = 0, lty = 1, lwd = 0.5)# Взвешенные средние видовvarespec_wa <- wascores(mod_pcoa_bray_cai$points[, 1:2], varespec)text(varespec_wa, rownames(varespec_wa), cex = 0.7, col = "red")# Решение 3 -----------------------------------------------------# Проекции переменных среды ->> таблицаmod_pcoa_bray_cai_env <- envfit(mod_pcoa_bray_cai, varechem)# Значимые наносим на графикplot(mod_pcoa_bray_cai_env, p.max = 0.05, col = "darkviolet")# --------------------------------------------------------------
mod_pcoa_bray_cai_env
## ## ***VECTORS## ## Dim1 Dim2 r2 Pr(>r) ## N 0.135 0.991 0.23 0.059 . ## P 0.487 -0.873 0.27 0.032 * ## K 0.726 -0.687 0.16 0.158 ## Ca 0.685 -0.729 0.35 0.008 ** ## Mg 0.726 -0.687 0.28 0.027 * ## S 0.211 -0.977 0.11 0.292 ## Al -0.987 0.159 0.52 0.002 ** ## Fe -0.974 0.225 0.46 0.001 ***## Mn 0.933 -0.360 0.44 0.004 ** ## Zn 0.761 -0.649 0.19 0.114 ## Mo -0.706 0.708 0.05 0.590 ## Baresoil 0.950 0.312 0.25 0.046 * ## Humdepth 0.914 -0.405 0.45 0.003 ** ## pH -0.992 -0.129 0.24 0.057 . ## ---## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1## Permutation: free## Number of permutations: 999
ape::pcoa()
library(ape) # здесь есть обе поправки к PCoAd_bray <- vegdist(varespec, method = "bray")
mod_pcoa_raw <- pcoa(d_bray)mod_pcoa_raw$values$Eigenvalues
## [1] 1.7552165 1.1334455 0.4429018## [4] 0.3698054 0.2453532 0.1960921## [7] 0.1751131 0.1284467 0.0971594## [10] 0.0759601 0.0637178 0.0583225## [13] 0.0394934 0.0172699 0.0051011## [16] 0.0000000 -0.0004131 -0.0064654## [19] -0.0133147 -0.0253944 -0.0375105## [22] -0.0480069 -0.0537146 -0.0741390
biplot.pcoa(mod_pcoa_raw, varespec)
mod_pcoa_cai <- pcoa(d_bray, correction = "cailliez")mod_pcoa_cai$values$Corr_eig
## [1] 2.63820 1.76344 0.77272## [4] 0.65286 0.47325 0.42136## [7] 0.37118 0.29904 0.25324## [10] 0.20761 0.19322 0.18756## [13] 0.14980 0.11123 0.09814## [16] 0.09244 0.08057 0.06839## [19] 0.04338 0.03522 0.03057## [22] 0.02086 0.00000 0.00000
biplot.pcoa(mod_pcoa_cai, varespec)
mod_pcoa_lin <- pcoa(d_bray, correction = "lingoes")mod_pcoa_lin$values$Corr_eig
## [1] 1.82936 1.20758 0.51704## [4] 0.44394 0.31949 0.27023## [7] 0.24925 0.20259 0.17130## [10] 0.15010 0.13786 0.13246## [13] 0.11363 0.09141 0.07924## [16] 0.07373 0.06767 0.06082## [19] 0.04874 0.03663 0.02613## [22] 0.02042 0.00000 0.00000
biplot.pcoa(mod_pcoa_lin, varespec)
PCA
PCoA
CA
nMDS
RDA по трансформированным данным
# ordiggplot Рисует график ординации из vegan в ggplotordiggplot <- function(mod, lab_size = 5, lab_var_size = 6, line_size = 0.5, point_size = 2, plot_sites = TRUE, plot_species = TRUE, plot_centroids = TRUE, plot_biplot = TRUE, plot_factorbiplot = TRUE, ...){ mod_dat <- scores(mod, tidy = TRUE, ...) ax_names <- colnames(mod_dat)[1:2] names(mod_dat)[1:2] <- c("X", "Y") mod_eig <- round(eigenvals(mod) / mod$tot.chi * 100, 2) ar <- arrow(angle = 10, length = unit(2, "mm"), type = "closed") gg <- ggplot() + geom_hline(yintercept = 0, colour = "grey70", size = 0.25) + geom_vline(xintercept = 0, colour = "grey70", size = 0.25) if(any(mod_dat$score == "sites" & plot_sites)) { gg <- gg + geom_point(data = filter(mod_dat, score == "sites"), aes(x = X, y = Y), size = point_size) + geom_text(data = filter(mod_dat, score == "sites"), aes(x = X, y = Y, label = label), size = lab_size, hjust = -0.7, colour = "grey40") } if(any(mod_dat$score == "species" & plot_species)) { gg <- gg + geom_segment(data = filter(mod_dat, score == "species"), aes(x = 0, y = 0, xend = X, yend = Y), size = line_size, colour = "orangered", arrow = ar) + geom_text(data = filter(mod_dat, score == "species"), aes(x = X, y = Y, label = label), size = lab_size, hjust = 1.3, vjust = 0.4, colour = "orangered") } if(any(mod_dat$score == "centroids" & plot_centroids)) { gg <- gg + geom_point(data = filter(mod_dat, score == "centroids"), aes(x = X, y = Y), shape = 13, size = 3, colour = "grey20") + geom_text(data = filter(mod_dat, score == "centroids"), aes(x = X, y = Y, label = label), size = lab_var_size, hjust = -0.2, colour = "grey20") } if(any(mod_dat$score == "factorbiplot" & plot_factorbiplot)) { gg <- gg + geom_point(data = filter(mod_dat, score == "factorbiplot"), aes(x = X, y = Y), shape = 19, size = 0.5, colour = "blue") + geom_text(data = filter(mod_dat, score == "factorbiplot"), aes(x = X, y = Y, label = label), size = lab_var_size, hjust = -0.2, colour = "blue") } if(any(mod_dat$score == "biplot" & plot_biplot)) { gg <- gg + geom_segment(data = filter(mod_dat, score == "biplot"), aes(x = 0, y = 0, xend = X, yend = Y), size = line_size, colour = "blue", arrow = ar) + geom_text(data = filter(mod_dat, score == "biplot"), aes(x = X, y = Y, label = label), size = lab_var_size, hjust = -0.2, colour = "blue") } gg + coord_cartesian() + labs(x = paste0(ax_names[1], " (", mod_eig[1], "%)"), y = paste0(ax_names[2], " (", mod_eig[2], "%)")) }
mod_tbrda <- rda(decostand(varespec, method = 'hellinger') ~ Mn + Baresoil + N, data = varechem)eigenvals(mod_tbrda)/sum(eigenvals(mod_tbrda))
## RDA1 RDA2 RDA3 PC1 PC2 PC3 PC4 PC5 ## 0.21529 0.07364 0.03424 0.22379 0.14284 0.07402 0.05034 0.04629 ## PC6 PC7 PC8 PC9 PC10 PC11 PC12 PC13 ## 0.02925 0.02751 0.02027 0.01602 0.01328 0.00973 0.00641 0.00517 ## PC14 PC15 PC16 PC17 PC18 PC19 PC20 ## 0.00351 0.00265 0.00166 0.00161 0.00120 0.00087 0.00039
# ordiggplot(mod_tbrda, scaling = 1)ordiggplot(mod_tbrda, scaling = 2) + aes(colour = varechem$Mn)
anova(mod_tbrda, by = "mar")
## Permutation test for rda under reduced model## Marginal effects of terms## Permutation: free## Number of permutations: 999## ## Model: rda(formula = decostand(varespec, method = "hellinger") ~ Mn + Baresoil + N, data = varechem)## Df Variance F Pr(>F) ## Mn 1 0.0492 3.99 0.004 **## Baresoil 1 0.0303 2.46 0.036 * ## N 1 0.0225 1.83 0.112 ## Residual 20 0.2468 ## ---## Signif. codes: ## 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Карт-бланш (ну, почти) на коэффициенты различия
Используется для анализа “неевклидовых” матриц различия
Для количественных признаков:
Для бинарных признаков:
Для других типов данных:
Legendre, Legendre, 2012
vegan
Классический вариант
(Legendre, Anderson, 1999)
vegan::capscale()
— смещенная вероятность ошибки I рода в многофакторных ANOVA.
add = "cailliez"
add = "lingoes"
Новый вариант
(McArdle, Anderson, 2001)
vegan::dbRDA()
— правильная вероятность ошибки I рода в многофакторных ANOVA.
mod_dbrda_lingoes <- capscale(varespec ~ Mn + Baresoil + N, distance = "bray", data = varechem, add = TRUE)eigenvals(mod_dbrda_lingoes)/sum(eigenvals(mod_dbrda_lingoes))
## CAP1 CAP2 CAP3 MDS1 MDS2 MDS3 MDS4 MDS5 ## 0.16464 0.07210 0.05017 0.16860 0.13427 0.07332 0.05147 0.04711 ## MDS6 MDS7 MDS8 MDS9 MDS10 MDS11 MDS12 MDS13 ## 0.03875 0.03134 0.02587 0.02299 0.02057 0.01895 0.01589 0.01378 ## MDS14 MDS15 MDS16 MDS17 MDS18 MDS19 MDS20 ## 0.01259 0.01080 0.00971 0.00668 0.00573 0.00339 0.00128
# ordiggplot(mod_dbrda_lingoes, scaling = 1)ordiggplot(mod_dbrda_lingoes, scaling = 2) + aes(colour = varechem$Mn)
anova(mod_dbrda_lingoes, by = "mar")
## Permutation test for capscale under reduced model## Marginal effects of terms## Permutation: free## Number of permutations: 999## ## Model: capscale(formula = varespec ~ Mn + Baresoil + N, data = varechem, distance = "bray", add = TRUE)## Df SumOfSqs F Pr(>F) ## Mn 1 0.70 3.16 0.003 **## Baresoil 1 0.51 2.29 0.026 * ## N 1 0.42 1.91 0.050 * ## Residual 20 4.46 ## ---## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Данные, описывающие состав сообщества:
В силу этих свойств:
Данные, описывающие состав сообщества:
В силу этих свойств:
Экологические данные можно трансформировать:
Данные, описывающие состав сообщества:
В силу этих свойств:
Экологические данные можно трансформировать:
PCoA позволяет изобразить пространство любого коэффициента в Евклидовом пространстве. Но, чтобы в ANOVA были правильные вероятности ошибок I рода, не должно быть отрицательных собственных чисел (есть поправки).
Данные из Borcard et al., 2011, исходно из PhD диссертации Verneaux (1973).
Verneaux (1973) предложил использовать сообщества рыб в качестве индикаторов состояния рек и ручьев.
doubs$fish
— Обилие 27 видов рыб в 30 точках на реке Дуdoubs$env
— 11 характеристик условий средыdoubs$xy
— Координаты точекПроанализируйте, какие факторы среды определяют облик сообществ рыб в реке Ду, если удалить влияние географической близости точек сбора.
data("doubs", package = "ade4")help("doubs", package = "ade4")
Schaffhausen, Public domain, via Wikimedia Commons
Река Ду - приток Соны. Находится на юго-востоке Франции (Бургундия) и западе Швейцарии. Исток в горах Юра.
По итогам диссертации Верно предложил классифицировать на 4 зоны:
Verneaux, J. (1973) Cours d’eau de Franche-Comté (Massif du Jura). Recherches écologiques sur le réseau hydrographique du Doubs. Essai de biotypologie. Thèse d’état, Besançon. 1–257.
Borcard, D., Gillet, F. & Legendre, P. (2011) Numerical Ecology with R. Springer, UseR! Edition.