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

Вопросы по статистическому пакету R. Не обязательно гео.
Ответить
_taras_
Активный участник
Сообщения: 186
Зарегистрирован: 28 июл 2018, 08:40
Репутация: 12
Откуда: Киев

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

Сообщение _taras_ » 12 мар 2022, 13:15

Доброго времени!
Подскажите
1. как провести множественное сравнение данных с участков, которые не подчиняющихся нормальному закону
2. как показать пары данных, которые между собой не различаются. Аналог Tukey’s HSD
Сами данные - результаты выжигания травостоя (DNBR index). Его распределение на рис.
Вложения
data.jpeg
data.jpeg (75.45 КБ) 4724 просмотра

gamm
Гуру
Сообщения: 4049
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1050
Ваше звание: программист
Откуда: Казань

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

Сообщение gamm » 12 мар 2022, 14:00

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

_taras_
Активный участник
Сообщения: 186
Зарегистрирован: 28 июл 2018, 08:40
Репутация: 12
Откуда: Киев

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

Сообщение _taras_ » 12 мар 2022, 14:12

Заранее прошу простить за возможное некорректное использование терминологии...
1) на рис. одна группа данных.
Такое распределение обусловлено, что высокотравная растительность полегла, деформировалась очень неоднородно.
2) Я попробовал использовать Multiple pairwise-comparison between groups.
4) выкладываю
Вложения
burned_dnestr.csv
(856.85 КБ) 225 скачиваний

gamm
Гуру
Сообщения: 4049
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1050
Ваше звание: программист
Откуда: Казань

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

Сообщение gamm » 12 мар 2022, 14:40

поля month;DNBR_03-04;DNBR_02-03;DNBR_01-02 - кто у нас кто, где группы, и чего мы хотим?

_taras_
Активный участник
Сообщения: 186
Зарегистрирован: 28 июл 2018, 08:40
Репутация: 12
Откуда: Киев

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

Сообщение _taras_ » 12 мар 2022, 15:01

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

gamm
Гуру
Сообщения: 4049
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1050
Ваше звание: программист
Откуда: Казань

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

Сообщение gamm » 12 мар 2022, 15:36

ничего понять не удалось, где группы, где контроль, чего нужно ...

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)

gamm
Гуру
Сообщения: 4049
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1050
Ваше звание: программист
Откуда: Казань

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

Сообщение gamm » 12 мар 2022, 15:58

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

_taras_
Активный участник
Сообщения: 186
Зарегистрирован: 28 июл 2018, 08:40
Репутация: 12
Откуда: Киев

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

Сообщение _taras_ » 12 мар 2022, 16:23

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

gamm
Гуру
Сообщения: 4049
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1050
Ваше звание: программист
Откуда: Казань

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

Сообщение gamm » 12 мар 2022, 16:43

вы так ничего и не прояснили ...

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). Или что-то в этом роде, сравнивая приращения. У вас же явно временной ряд, но непонятно, как получены в нем данные.

_taras_
Активный участник
Сообщения: 186
Зарегистрирован: 28 июл 2018, 08:40
Репутация: 12
Откуда: Киев

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

Сообщение _taras_ » 12 мар 2022, 17:49

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

gamm
Гуру
Сообщения: 4049
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1050
Ваше звание: программист
Откуда: Казань

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

Сообщение gamm » 12 мар 2022, 19:48

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

_taras_
Активный участник
Сообщения: 186
Зарегистрирован: 28 июл 2018, 08:40
Репутация: 12
Откуда: Киев

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

Сообщение _taras_ » 12 мар 2022, 21:19

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

gamm
Гуру
Сообщения: 4049
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1050
Ваше звание: программист
Откуда: Казань

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

Сообщение gamm » 12 мар 2022, 22:49

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

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

Ivor
Завсегдатай
Сообщения: 345
Зарегистрирован: 11 дек 2006, 09:46
Репутация: 102
Откуда: Иркутск

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

Сообщение Ivor » 13 мар 2022, 04:23

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

gamm
Гуру
Сообщения: 4049
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1050
Ваше звание: программист
Откуда: Казань

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

Сообщение gamm » 13 мар 2022, 07:31

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

Ответить

Вернуться в «R»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 4 гостя