Страница 1 из 1

Множественное сравнение данных неподчиняющихся нормальному закону

Добавлено: 12 мар 2022, 13:15
_taras_
Доброго времени!
Подскажите
1. как провести множественное сравнение данных с участков, которые не подчиняющихся нормальному закону
2. как показать пары данных, которые между собой не различаются. Аналог Tukey’s HSD
Сами данные - результаты выжигания травостоя (DNBR index). Его распределение на рис.

Re: Множественное сравнение данных неподчиняющихся нормальному закону

Добавлено: 12 мар 2022, 14:00
gamm
1) слово "сравнение" предполагает наличие групп, нормальность должна быть в группах. Для начала нужно посмотреть распределение в группах, распределение кучи ни о чем не говорит. Возможно, стоит сделать разбиение на однородные кластеры, и посмотреть распределение в них (например, сделать модель Gaussian Mixture)
2) если в группах распределение не нормальное, то есть непараметрические тесты для средних/медиан, им все равно. Плюс поправки, в простейшем случае Бонферони.
3) если распределение в группах поддается описанию (параметризации), то строится линейная модель с ссответствующим распределением, и делается ее анализ. Как минимум есть вариант "все против одного", например сравнение контрольного участка с анализируемыми.
4) данные выложите, чтобы посмотреть

Re: Множественное сравнение данных неподчиняющихся нормальному закону

Добавлено: 12 мар 2022, 14:12
_taras_
Заранее прошу простить за возможное некорректное использование терминологии...
1) на рис. одна группа данных.
Такое распределение обусловлено, что высокотравная растительность полегла, деформировалась очень неоднородно.
2) Я попробовал использовать Multiple pairwise-comparison between groups.
4) выкладываю

Re: Множественное сравнение данных неподчиняющихся нормальному закону

Добавлено: 12 мар 2022, 14:40
gamm
поля month;DNBR_03-04;DNBR_02-03;DNBR_01-02 - кто у нас кто, где группы, и чего мы хотим?

Re: Множественное сравнение данных неподчиняющихся нормальному закону

Добавлено: 12 мар 2022, 15:01
_taras_
Горела растительность в феврале, марте, апреле.
Поля DNBR_03-04 - результат расчета по формуле определения выгоревших и контрольных участков по месяцам когда наблюдались пожары.
Выгорел в феврале (DNBR_01-02) участок и надобно показать, что значения, которые рассчитаны для данного участка отличаются от других негоревших и горевших. Т.е. в феврале сравниваем группу month- "Feb" с остальными.
В марте -"March" (DNBR_02-03) и "April" ( DNBR_03-04) с остальными.
Сравнение несгоревших участков между собой нужно для дальнейшей оценки развития растительности в зависимости от локальных условий.

Re: Множественное сравнение данных неподчиняющихся нормальному закону

Добавлено: 12 мар 2022, 15:36
gamm
ничего понять не удалось, где группы, где контроль, чего нужно ...

DNBR_02-03 - это какие-то разности, в данном слечае между февралем и мартом. А какой смысл имеет поле month, в котором значения April, Feb, Kontrol, March ?

" Т.е. в феврале сравниваем группу month- "Feb" с остальными." - к чему относится "в феврале"? где группы, которые нужно сравнивать?

У вас есть 4 набора строк (April, Feb, Kontrol, March) и 3 столбца ("DNBR_03.04" "DNBR_02.03" "DNBR_01.02").
Я пока единственное, что могу предположить, что "в феврале" берется столбец DNBR_01.02, и сравнивается группа строк в нем для month == "Feb" с остальными 3 группами. Либо берутся данные из 3 столбцов, строки с month == "Feb". Либо еще что-то :mrgreen:

А в данных столбцов смесь, там одна куча около 0, вторая больше нуля. Примерная картинка порождается скриптом

Код: Выделить всё

fn="burned_dnestr.csv"
p=read.table(fn,header=TRUE,sep=";",dec=",",as.is=TRUE)
names(p)
str(p)
# [1] "month"      "DNBR_03.04" "DNBR_02.03" "DNBR_01.02"

old.par=par(mfrow=c(1,3))
hist(p$DNBR_03.04,breaks=100,col="gray")
hist(p$DNBR_02.03,breaks=100,col="gray")
hist(p$DNBR_01.02,breaks=100,col="gray")
par(old.par)

# https://www.r-bloggers.com/2011/08/fitting-mixture-distributions-with-the-r-package-mixtools/
library(mixtools)

#========================================================================================================================
# --- распределение
#========================================================================================================================
cur.x = p$DNBR_03.04
cur.mu = c(0,0.2)
cur.sigma = c(0.05,0.05)
cur.fit1 = normalmixEM(cur.x, lambda = NULL, mu = cur.mu, sigma = cur.sigma, k = 2, 
                      mean.constr = NULL, sd.constr = NULL,
                      epsilon = 1e-08, maxit = 1000, maxrestarts=20, 
                      verb = TRUE, fast=FALSE, ECM = FALSE,
                      arbmean = TRUE, arbvar = TRUE) 

hist(cur.x,breaks=100,col="gray",prob=TRUE)
xx=seq(-0.1,0.4,len=500)
for(i in 1:length(cur.fit1$lambda)) {
  ff=cur.fit1$lambda[i]*dnorm(xx,cur.fit1$mu[i],cur.fit1$sigma[i])
  points(xx,ff,type="l",col="red",lwd=3)
}

#-----------------------------------------------------------------------------------------
cur.x = p$DNBR_02.03
cur.mu = c(0,0.05,0.2)
cur.sigma = c(0.05,0.05,0.05)
cur.fit2 = normalmixEM(cur.x, lambda = NULL, mu = cur.mu, sigma = cur.sigma, k = 2, 
                      mean.constr = NULL, sd.constr = NULL,
                      epsilon = 1e-08, maxit = 1000, maxrestarts=20, 
                      verb = TRUE, fast=FALSE, ECM = FALSE,
                      arbmean = TRUE, arbvar = TRUE) 
hist(cur.x,breaks=100,col="gray",prob=TRUE)
xx=seq(-0.4,0.4,len=500)
for(i in 1:length(cur.fit2$lambda)) {
  ff=cur.fit2$lambda[i]*dnorm(xx,cur.fit2$mu[i],cur.fit2$sigma[i])
  points(xx,ff,type="l",col="red",lwd=3)
}

#-----------------------------------------------------------------------------------------
cur.x = p$DNBR_01.02
cur.mu = c(0,0.2)
cur.sigma = c(0.05,0.05)
cur.fit1 = normalmixEM(cur.x, lambda = NULL, mu = cur.mu, sigma = cur.sigma, k = 2, 
                      mean.constr = NULL, sd.constr = NULL,
                      epsilon = 1e-08, maxit = 1000, maxrestarts=20, 
                      verb = TRUE, fast=FALSE, ECM = FALSE,
                      arbmean = TRUE, arbvar = TRUE) 

hist(cur.x,breaks=100,col="gray",prob=TRUE)
xx=seq(-0.1,0.4,len=500)
for(i in 1:length(cur.fit1$lambda)) {
  ff=cur.fit1$lambda[i]*dnorm(xx,cur.fit1$mu[i],cur.fit1$sigma[i])
  points(xx,ff,type="l",col="red",lwd=3)
}

#========================================================================================================================
# --- Месяцы
#========================================================================================================================
table(p$month)
#  April     Feb Kontrol   March 
#  14855    3381    2211    8308

# Горела растительность в феврале, марте, апреле.
# Поля DNBR_03-04 - результат расчета по формуле определения выгоревших и контрольных участков по месяцам когда наблюдались пожары.
# Выгорел в феврале (DNBR_01-02) участок и надобно показать, что значения, которые рассчитаны для данного участка отличаются от других негоревших и горевших. 
# Т.е. в феврале сравниваем группу month- "Feb" с остальными.
# В марте -"March" (DNBR_02-03) и "April" ( DNBR_03-04) с остальными.
# Сравнение несгоревших участков между собой нужно для дальнейшей оценки развития растительности в зависимости от локальных условий.

cur.month = "Feb"
ind = (p$month == cur.month)
old.par=par(mfrow=c(1,3))
hist(p$DNBR_03.04[ind],breaks=100,col="gray")
hist(p$DNBR_02.03,breaks=100,col="gray")
hist(p$DNBR_01.02,breaks=100,col="gray")
par(old.par)

Re: Множественное сравнение данных неподчиняющихся нормальному закону

Добавлено: 12 мар 2022, 15:58
gamm
если разложить выборку на смесь, то можно получить распределение для компонент. Насколько я понимаю, интерсует объем (доля) второй. Если есть распределение, то можно просто посчитать оценку среднего, используя как веса вероятности компонент из cur.fit$posterior. Т.е. посмитать взвешенное среднее и дисперсию, а потом сравнить. Или сделать еще сто-то, в зависимости от (пока непонятной) задачи.

Re: Множественное сравнение данных неподчиняющихся нормальному закону

Добавлено: 12 мар 2022, 16:23
_taras_
gamm писал(а):
12 мар 2022, 15:36
А какой смысл имеет поле month, в котором значения April, Feb, Kontrol, March ?
Их можно считать как контроли. Т.е. смысл в том, что сгоревший участок, например в феврале, сравнить со всеми остальными за этот месяц и показать, что он отличается от них и это не зависит от их местоположения. Аналогично и др. участками.
boxplot (рис1) по февралю как представляю сравнение.
Функция pairwise.wilcox.test показывает, что имеются различия между участками. Надеюсь я его правильно использую.
Возможно такое сравнение излишнее и следовало делать только контроль и сгоревший участок. Однако территория большая локальные условия могут сильно отличаться. Хотя и заняты одной растительностью. Масштаб пожара на картинке.

Re: Множественное сравнение данных неподчиняющихся нормальному закону

Добавлено: 12 мар 2022, 16:43
gamm
вы так ничего и не прояснили ...

1) Глядя на последний боксплот можно предположить, что сравнивать нужно группы одного столбца, задаваемые полем month. Но что сравнивать, и с чем, и зачем, непонятно.
2) Ниже скриптик, он показавает распределения по группам столбец:месяц. Они не все унимодальные, и рпспределение перекошенное. Сравнивать средние спысла нет, поскольку средние ничего не говорят о том, что и как выросло (там только столбец 3-4 более-менее унимодальный.

Код: Выделить всё

month.list=sort(unique(p$month))
var.list = c("DNBR_03.04", "DNBR_02.03", "DNBR_01.02")
old.par=par(mfrow=c(3,4))
for(i.var in 1:3) {
  cur.var = var.list[i.var]
  cur.x=p[,cur.var]
  for(i.month in 1:length(month.list)) {
    cur.month = month.list[i.month]
    cur.sel = p$month == cur.month
    hist(cur.x[cur.sel],breaks=50,col="gray",main=sprintf("%s, %s",cur.var,cur.month))
  }
}
par(old.par)
3) возможно, имеет смысл сформулировать задачу в смысле распределений, например сравнивать функции распределения (которые c.d.f или F). Или что-то в этом роде, сравнивая приращения. У вас же явно временной ряд, но непонятно, как получены в нем данные.

Re: Множественное сравнение данных неподчиняющихся нормальному закону

Добавлено: 12 мар 2022, 17:49
_taras_
Уважаемый gamm! Спасибо за Ваши ответы.
Однако есть некоторое разночтение задачи, ну или я ее внятно не формулирую...
Суть в том, чтобы доказать, что горевший участок отличается от несгоревших. Возможно надо упростить и для DNBR_01-02 убираем всё кроме февраля и контроля и сравниваем их. С использованием Kruskal-Wallis test-а оказываем, что участки различны.
3) В данном случае речь идет о мертвой растительности и изменения в контроле вызваны только влиянием погоды и для нас не интересны.
Для значений вегетационных индексов все, что Вы написали в п.3. будут делаться.

Re: Множественное сравнение данных неподчиняющихся нормальному закону

Добавлено: 12 мар 2022, 19:48
gamm
Попробуйте описать процесс получения данных. Например, о каких участках речь, в присланной таблице их нет. Пока ничего понять нельзя. Обычно помогает рисование абстрактной картинки.

Re: Множественное сравнение данных неподчиняющихся нормальному закону

Добавлено: 12 мар 2022, 21:19
_taras_
Целью является определение влияния зимне-весеннего выжигания на динамику значений вегетационных индексов болотной растительности по данным дистанционного зондирования.
Были пожары зимой и ранней весной. По спектральным каналам космоснимков для каждого месяца были рассчитан индекс NBR (Нормализованный коэффициент выгорания), затем DNBR (разностный индекс гарей). Особенностью использования данного метода именно для болотной растительности является маленькие различия индексов между горевшей и не сгоревшей территориями. Во вторых развитие растительности на территории исследований происходит неоднородно, что тоже хочется учесть.
Первая задача - показать, что выгоревшие участки, вне зависимости от того когда это произошло, значимо отличаются от не сгоревшей территории вне зависимости от её территориального положения.
Отсюда для февральского пожара (DNBR_01-02) контролем все не сгоревшие участки - март, апрель и контроль. Март (DNBR_02-03) - апрель и контроль, апрель (DNBR_03-04) - контроль (Kontrol). И после того как показали различия между выжженной и не выжженной территориями перейду к индексам.

Re: Множественное сравнение данных неподчиняющихся нормальному закону

Добавлено: 12 мар 2022, 22:49
gamm
Ответа так и нет, кто такие участки, сколько их и как связаны с таблицей. Что объединяет числа в одной строке таблицы, это один и тот же пиксель территории? Или между ними вообще ничего общего? Из данных таблицы есть 12 сочетаний month, столбец. Как они связаны с участками (пикселями территории) и последовательностью пожаров?

Если строка это пиксель, столбец разность индексов между месяцами по всей территории, а month месяц пожара (для kontrol пожара не было), то тут не сравнивать надо, а проверять гипотезу о наличии ступеньки в строке в позиции, соответствующей месяцу строки или типа того. Проблема в том, что, судя по многомодальности, горело все неоднородно, что то недогорело, или вообще не сгорело. И многое зависит от того, как очерчивали пожар.

Re: Множественное сравнение данных неподчиняющихся нормальному закону

Добавлено: 13 мар 2022, 04:23
Ivor
Исходя из постановки задачи вам вообще не надо делить по месяцам. Просто берёте участки горелые (за все месяца) и негорелые и выносите, для начала, на график в координатах [NBR, DNBR]. Если обе группы будут смешаны до неразличения - значит значимо они не различаются (для данных индексов, о чём вы и говорите), и нужно искать другой подход.

Re: Множественное сравнение данных неподчиняющихся нормальному закону

Добавлено: 13 мар 2022, 07:31
gamm
учитывая "кривизну" распределений, можно использать vegan::anosim() и подобные непапаметрические тесты сравнения значений в группах (а не средних или медиан, как упомянутые выше тесты).