使用对数变换使左偏分布正常吗?

时间:2018-11-17 21:49:41

标签: r transformation

我有一个数据集,该数据集的变量具有左偏分布(尾巴在左侧)。

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),因此Kruskal Wallace可以工作,除了随机效应和一个预测变量项。我进行了Shapiro Wilk测试,我的数据肯定是非正常的。如果可以的话,我想转换我的数据,以便ANOVA有更好的机会检测到重要的结果。要么,要么对非正常数据进行混合效果测试。

@Ben Bolker-感谢您的答复;我很感激。我确实读过您的答案,但我仍在仔细阅读您的一些建议的含义(我对统计数据非常陌生)。我的p值非常接近有效值,因此我不希望进行p破解,但我也想给我的数据最大的机会,使其成为重要值。如果我不能证明转换数据或使用除方差分析以外的其他方法,那就可以了。

我在下面提供了数据帧快照。我的响应变量是“ temp.max”,即植物死亡的最高温度。我的预测变量是“ growth.chamber”(29或21度生长室)和“环境”(田地或森林)。我的随机变量是“ groupID”(种植植物的组,由5-10个个体组成)。这是一个互惠的移植实验,所以我在21度和29度室内饲养了森林和野外植物。我想知道的是,田间和森林种群之间的“最大温度”是否不同,生长室之间的“最大温度”是否不同,以及关于温度最大的环境和生长室之间是否存在任何相互作用。我将非常非常感谢您的帮助。谢谢。

    > 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 :(得分:4)

tl; dr ,您实际上可能不必担心此处的偏斜。

这里有一些问题,由于它们主要是统计问题,而不是与编程有关的问题,所以这个问题可能与CrossValidated更为相关。

如果我正确复制了您的数据,则它们等效于此:

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

enter image description here

您的数据是离散的-这就是@ user113156发布的密度图具有明显峰值的原因。

这里是问题:

  • 最重要的是,出于大多数统计目的,您实际上对边际分布的正态性并不感兴趣,这就是您在此处显示的。相反,您想知道模型中残差的分布是否为正态;对于方差分析,这等效于询问每个组中 中的值的分布是否为正态(并且这些组具有相似的组内方差)。
  • 正常性不是很重要;方差分析对于中等程度的非正态性具有鲁棒性(例如,参见here)。
  • 日志转换会以错误的方向修改您的数据(即,它会趋于增加向左偏斜)。通常,修复这种左偏数据需要进行转换,例如提高至幂> 1(与对数或平方根转换相反的方向),但是当值远非零时,通常并没有太大帮助无论如何。
  • 一些统计选项,如果您担心:
    • 一种非参数的,基于等级的检验,例如 Kruskal-Wallis 检验(1-方差分析的基于等级的类似物)
    • 进行方差分析,但使用基于排列的方法来检验统计显着性。
    • 使用常规模型
    • 使用分层自举(集群内和集群间替换中的重采样)得出参数的更可靠的置信区间

答案 1 :(得分:2)

您的变量遵循离散分布。您的整数值为35(n = 2)至40(n = 30)。我认为您需要进行一些序数分析,将值从35降低到37,而在一类中的观测值更少。否则,您可以使用kruskal.test()函数执行非参数分析。

答案 2 :(得分:0)

我有坏消息和好消息。

  • 坏消息是,我在您的数据中看不到具有统计学意义的模式。
  • 好消息是,鉴于实验设计的结构,您可以更简单地分析数据(不需要混合模型)

加载软件包,调整默认值

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

检查数据结构

处理数据可确认这是一个嵌套设计;每个组都在单个环境/生长室组合中发生。

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