Сделать левостороннее распределение нормальным с помощью преобразования журнала? - PullRequest
0 голосов
/ 18 ноября 2018

У меня есть набор данных с переменной, которая имеет левостороннее распределение (хвост слева).

variable <- c(rep(35, 2), rep(36, 4), rep(37, 16), rep(38, 44), rep(39, 72), rep(40, 30))

Я просто хочу, чтобы эти данные имели более нормальное распределение, чтобы я мог выполнить анову, но использование log10 или log2 делает их все еще смещенными влево. Какое преобразование я могу использовать, чтобы сделать эти данные более нормальными?

РЕДАКТИРОВАТЬ: Моя модель: mod <- lme(reponse ~ variable*variable2, random=~group, data=data), поэтому Крускал Уоллес будет работать, за исключением случайного эффекта и одного термина предикторов. Я сделал тест Шапиро Уилка, и мои данные определенно ненормальные. Если это оправдано, я хотел бы преобразовать свои данные, чтобы дать ANOVA больше шансов обнаружить значительный результат. Либо это, либо тест смешанного эффекта для ненормальных данных.

@ Бен Болкер - Спасибо за ваш ответ; Я ценю его. Я прочитал ваш ответ, но все еще читаю, что именно означают некоторые из ваших предложений (я очень плохо знаком со статистикой). Мое p-значение довольно близко к значимому, и я не хочу p-hack, но я также хочу дать моим данным наилучший шанс быть значимым. Если я не могу оправдать преобразование своих данных или использование чего-либо, кроме ANOVA, пусть будет так.

Я предоставил снимок экрана с данными ниже. Моя переменная ответа - «temp.max», максимальная температура, при которой умирает растение. Моими переменными предиктора являются «рост.камера» (камера роста 29 или 21 градус) и «среда» (поле или лес). Моя случайная величина - «groupID» (группа, в которой были выращены растения, состоящая из 5-10 особей). Это эксперимент по взаимной пересадке, поэтому я выращивал как лесные, так и полевые растения в камерах как 21, так и 29 градусов. Что я хочу знать, так это то, отличается ли «temp.max» между полевыми и лесными популяциями, отличается ли «temp.max» между камерами роста и существует ли какое-либо взаимодействие между средой и камерой роста в отношении temp.max. Я очень, очень признателен за любую помощь. Спасибо.

    > dput(data)
    structure(list(groupID = structure(c(12L, 12L, 12L, 12L, 12L, 
    12L, 12L, 12L, 12L, 12L, 14L, 14L, 14L, 14L, 14L, 14L, 14L, 14L, 
    14L, 14L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 16L, 16L,         
    16L, 16L, 16L, 19L, 19L, 19L, 19L, 19L, 19L, 19L, 19L, 19L, 19L, 
    18L, 18L, 18L, 18L, 18L, 18L, 18L, 18L, 18L, 18L, 17L, 17L, 17L, 
    17L, 17L, 17L, 17L, 20L, 20L, 20L, 20L, 20L, 20L, 20L, 20L, 20L, 
    2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 3L, 3L, 3L, 3L, 3L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 
    6L, 6L, 6L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 7L, 7L, 7L, 7L, 7L, 7L, 
    7L, 7L, 7L, 7L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 13L, 13L, 13L, 
    13L, 13L, 13L, 13L, 13L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 
    9L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 11L, 11L, 
    11L, 11L, 11L, 8L, 8L, 8L, 8L, 8L), .Label = c("GRP_104", "GRP_111", 
    "GRP_132", "GRP_134", "GRP_137", "GRP_142", "GRP_145", "GRP_147", 
    "GRP_182", "GRP_192", "GRP_201", "GRP_28", "GRP_31", "GRP_40", 
    "GRP_68", "GRP_70", "GRP_78", "GRP_83", "GRP_92", "GRP_98"), class =                 "factor"), 
individual = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 1L, 
2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 1L, 2L, 3L, 4L, 5L, 
6L, 7L, 8L, 9L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 6L, 
7L, 8L, 9L, 10L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 
1L, 2L, 3L, 4L, 5L, 6L, 7L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 
9L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 16L, 17L, 1L, 2L, 3L, 
4L, 5L, 6L, 7L, 8L, 9L, 10L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 
3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 1L, 2L, 3L, 4L, 5L, 6L, 
7L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 15L, 16L, 20L, 1L, 2L, 3L, 
4L, 5L, 6L, 7L, 16L, 1L, 2L, 3L, 4L, 5L, 11L, 12L, 14L, 1L, 
2L, 3L, 4L, 5L, 6L, 7L, 18L, 19L, 20L, 1L, 2L, 3L, 4L, 5L, 
16L, 17L, 18L, 19L, 20L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 
4L, 5L), temp.max = c(39L, 35L, 39L, 39L, 35L, 40L, 40L, 
40L, 40L, 39L, 39L, 39L, 39L, 39L, 39L, 39L, 39L, 38L, 38L, 
38L, 39L, 39L, 40L, 38L, 40L, 39L, 39L, 40L, 40L, 39L, 39L, 
39L, 39L, 39L, 39L, 39L, 39L, 39L, 39L, 39L, 39L, 40L, 38L, 
40L, 40L, 40L, 40L, 40L, 40L, 39L, 40L, 39L, 39L, 40L, 39L, 
39L, 39L, 39L, 38L, 38L, 38L, 38L, 40L, 39L, 39L, 38L, 38L, 
39L, 39L, 37L, 39L, 39L, 37L, 39L, 39L, 39L, 39L, 37L, 39L, 
39L, 38L, 37L, 38L, 38L, 38L, 36L, 36L, 36L, 37L, 37L, 40L, 
39L, 40L, 39L, 39L, 37L, 37L, 38L, 38L, 38L, 37L, 38L, 38L, 
38L, 37L, 38L, 38L, 37L, 38L, 40L, 38L, 38L, 38L, 38L, 37L, 
38L, 39L, 38L, 38L, 38L, 38L, 38L, 40L, 38L, 40L, 39L, 39L, 
39L, 39L, 39L, 39L, 39L, 39L, 39L, 40L, 40L, 39L, 39L, 38L, 
37L, 39L, 37L, 39L, 39L, 39L, 39L, 39L, 39L, 40L, 39L, 39L, 
40L, 40L, 38L, 40L, 40L, 36L, 38L, 38L, 38L, 38L, 37L, 37L, 
38L, 38L, 38L, 39L, 39L), environment = structure(c(1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L), .Label = c("field", "forest"), class = "factor"), growth.chamber = c(29L, 
29L, 29L, 29L, 29L, 29L, 29L, 29L, 29L, 29L, 21L, 21L, 21L, 
21L, 21L, 21L, 21L, 21L, 21L, 21L, 21L, 21L, 21L, 21L, 21L, 
21L, 21L, 21L, 21L, 29L, 29L, 29L, 29L, 29L, 21L, 21L, 21L, 
21L, 21L, 21L, 21L, 21L, 21L, 21L, 29L, 29L, 29L, 29L, 29L, 
29L, 29L, 29L, 29L, 29L, 29L, 29L, 29L, 29L, 29L, 29L, 29L, 
21L, 21L, 21L, 21L, 21L, 21L, 21L, 21L, 21L, 29L, 29L, 29L, 
29L, 29L, 29L, 29L, 29L, 29L, 29L, 21L, 21L, 21L, 21L, 21L, 
21L, 21L, 21L, 21L, 21L, 29L, 29L, 29L, 29L, 29L, 21L, 21L, 
21L, 21L, 21L, 21L, 21L, 21L, 21L, 21L, 29L, 29L, 29L, 29L, 
29L, 29L, 29L, 21L, 21L, 21L, 21L, 21L, 21L, 21L, 21L, 21L, 
21L, 29L, 29L, 29L, 29L, 29L, 29L, 29L, 29L, 21L, 21L, 21L, 
21L, 21L, 21L, 21L, 21L, 21L, 21L, 21L, 21L, 21L, 21L, 21L, 
21L, 21L, 21L, 29L, 29L, 29L, 29L, 29L, 29L, 29L, 29L, 29L, 
29L, 21L, 21L, 21L, 21L, 21L, 29L, 29L, 29L, 29L, 29L)), .Names =                 c("groupID", 
    "individual", "temp.max", "environment", "growth.chamber"), row.names =                 c(1L, 
    2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 21L, 22L, 23L, 24L, 25L, 
    26L, 27L, 28L, 29L, 30L, 41L, 42L, 43L, 44L, 45L, 46L, 47L, 48L, 
    49L, 58L, 59L, 60L, 61L, 62L, 68L, 69L, 70L, 71L, 72L, 73L, 74L, 
    75L, 76L, 77L, 88L, 89L, 90L, 91L, 92L, 93L, 94L, 95L, 96L, 97L, 
    108L, 109L, 110L, 111L, 112L, 113L, 114L, 122L, 123L, 124L, 125L, 
    126L, 127L, 128L, 129L, 130L, 139L, 140L, 141L, 142L, 143L, 144L, 
    145L, 146L, 147L, 148L, 158L, 159L, 160L, 161L, 162L, 163L, 164L, 
    165L, 166L, 167L, 178L, 179L, 180L, 181L, 182L, 188L, 189L, 190L, 
    191L, 192L, 193L, 194L, 195L, 196L, 197L, 208L, 209L, 210L, 211L, 
    212L, 213L, 214L, 222L, 223L, 224L, 225L, 226L, 227L, 228L, 229L, 
    230L, 231L, 242L, 243L, 244L, 245L, 246L, 247L, 248L, 249L, 258L, 
    259L, 260L, 261L, 262L, 263L, 264L, 265L, 272L, 273L, 274L, 275L, 
    276L, 277L, 278L, 279L, 280L, 281L, 292L, 293L, 294L, 295L, 296L, 
    297L, 298L, 299L, 300L, 301L, 312L, 313L, 314L, 315L, 316L, 322L, 
    323L, 324L, 325L, 326L), class = "data.frame")

Ответы [ 3 ]

0 голосов
/ 18 ноября 2018

Ваша переменная следует дискретному распределению. У вас есть целочисленные значения в диапазоне от 35 (n = 2) до 40 (n = 30). Я думаю, что вам нужно провести некоторый порядковый анализ свертывания значений от 35 до 37, которые имеют меньше наблюдений в одной категории. В противном случае вы можете выполнить непараметрический анализ, используя функцию kruskal.test ().

0 голосов
/ 21 ноября 2018

У меня плохие новости и хорошие новости.

  • плохая новость в том, что я не вижу статистически значимых закономерностей в ваших данных.
  • хорошая новость в том, что, учитываяструктура вашего экспериментального проекта, вы можете анализировать свои данные намного проще (вам не нужны смешанные модели)

загружать пакеты, корректировать значения по умолчанию

library(ggplot2); theme_set(theme_bw())
library(dplyr)

проверять структуруdata

Табулирование данных подтверждает, что это вложенный дизайн ;каждая группа встречается в одной комбинации среды / камеры роста.

tt <- with(dd,table(groupID,
      interaction(environment,growth.chamber)))
## exactly one non-zero entry per group
all(rowSums(tt>0)==1)

совокупные данные

Преобразование growth.chamber в категориальную переменную;сверните каждую группу до ее среднего значения temp.max (и запишите число наблюдений на группу)

dda <-(dd
    %>% mutate(growth.chamber=factor(growth.chamber))
    %>% group_by(groupID,environment,growth.chamber)
    %>% summarise(n=n(),temp.max=mean(temp.max))
)
ggplot(dda,aes(growth.chamber,temp.max,
               colour=environment))+
  geom_boxplot(aes(fill=environment),alpha=0.2)+
  geom_point(position=position_dodge(width=0.75),
             aes(size=n),alpha=0.5)+
    scale_size(range=c(3,7))

enter image description here

Анализ

Теперь, когда мы агрегировали (не теряя никакой информации, которая нас интересует), мы можем использовать линейную регрессию с весами, указывающими количество выборок на наблюдение:

m1 <- lm(temp.max~growth.chamber*environment,weights=n,
         data=dda)

Проверка распределения и т. Д. Остатков:

plot(m1)

enter image description here

Все это выглядит отлично;нет признаков серьезного смещения, гетероскедастичности, ненормальности или выбросов ...

summary(m1)
## Coefficients:
##                                    Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                         38.2558     0.2858 133.845   <2e-16 ***
## growth.chamber29                     0.3339     0.4144   0.806    0.432    
## environmentforest                    0.2442     0.3935   0.620    0.544    
## growth.chamber29:environmentforest   0.3240     0.5809   0.558    0.585    
## Residual standard error: 1.874 on 16 degrees of freedom
## Multiple R-squared:  0.2364, Adjusted R-squared:  0.09318 
## F-statistic: 1.651 on 3 and 16 DF,  p-value: 0.2174

или график коэффициента (dotwhisker::dwplot(m1))

в то время как график данных не выглядит как будто это просто шум, статистический анализ показывает, что мы действительно не можем отличить его от шума ... enter image description here

0 голосов
/ 18 ноября 2018

tl; dr вам, вероятно, на самом деле не нужно беспокоиться о перекосе здесь.

Здесь есть несколько проблем, и поскольку они в основном статистические, а не программирующие.связанный, этот вопрос, вероятно, более актуален для CrossValidated .

Если я правильно скопировал ваши данные, они эквивалентны следующему:

dd <- rep(35:40,c(2,4,16,44,72,30))
plot(table(dd))

enter image description here

Ваши данные дискретны - поэтому график плотности, который @ user113156 публикует, имеет отчетливые пики.

Вот проблемы:

  • наиболее важным является то, что для большинства статистических целей вы на самом деле не интересуетесь нормальностью распределения marginal , которое вы демонстрируете здесь.Скорее, вы хотите знать, является ли распределение остатков из модели нормальным или нет;для ANOVA это равносильно тому, чтобы спросить, является ли распределение значений в пределах каждой группы нормальным (и группы имеют сходные отклонения внутри группы).
  • Нормальность не очень важна;ANOVA является устойчивой к умеренной степени ненормальности (например, см. здесь ).
  • Преобразование журнала изменяет ваши данные в неправильном направлении (то есть оно будет стремиться к увеличению левая асимметрия).В общем случае исправление такого рода искаженных данных влево требует преобразования, такого как повышение до степени> 1 (противоположное направление от преобразования логарифмического или квадратного корня), но когда значения далеки от нуля, это обычно не очень помогаетв любом случае.
  • Некоторые статистические варианты, если вы беспокоитесь:
    • непараметрический критерий, основанный на рангах, такой как Крускал-Уоллис (основанный на рангах аналог1-way ANOVA)
    • сделать ANOVA, но использовать подход на основе перестановок для проверки статистической значимости.
    • использовать порядковый номер модель
    • использоватьиерархическая начальная загрузка (повторная выборка в рамках замены внутри и между кластерами) для получения более надежных доверительных интервалов для параметров
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...