首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用对数变换使左偏分布正态吗?

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

Stack Overflow用户
提问于 2018-11-18 05:49:41
回答 3查看 700关注 0票数 0

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

代码语言:javascript
复制
variable <- c(rep(35, 2), rep(36, 4), rep(37, 16), rep(38, 44), rep(39, 72), rep(40, 30))

我只是想让这些数据有一个更正态的分布,这样我就可以执行anova,但是使用log10或log2仍然会使它向左倾斜。我可以使用什么转换来使这些数据更正常?

编辑:我的模型是:mod <- lme(reponse ~ variable*variable2, random=~group, data=data),所以Kruskal Wallace可以工作,除了随机效应和一个预测项。我做了一个夏皮罗·威尔克测试,我的数据绝对是非正态的。如果合理,我想转换我的数据,使方差分析有更好的机会检测到显着的结果。或者对非正态数据进行混合效应检验。

@Ben Bolker -感谢您的回复,非常感谢。我确实读过你的答案,但我仍然在阅读你的一些建议的确切含义(我对统计学非常陌生)。我的p值相当接近重要的,我不想p-hack,但我也想让我的数据有最好的机会成为重要的。如果我不能证明转换数据或使用方差分析以外的其他方法是合理的,那么就这么做吧。

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

代码语言:javascript
复制
    > 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")
EN

回答 3

Stack Overflow用户

发布于 2018-11-18 06:49:01

tl;dr你可能实际上不需要担心这里的偏差。

这里有几个问题,因为它们大多是统计问题,而不是与编程相关的问题,所以这个问题可能与CrossValidated更相关。

如果我正确地复制了您的数据,它们等同于:

代码语言:javascript
复制
dd <- rep(35:40,c(2,4,16,44,72,30))
plot(table(dd))

你的数据是离散的-这就是为什么@user113156发布的密度图有明显的峰值。

以下是问题:

最重要的是,对于大多数统计目的,你实际上对边缘分布的正态性并不感兴趣,这就是你在这里展示的。,,

  • 。相反,你想知道一个模型的残差分布是否为正态分布;对于方差分析,这相当于询问每个组内的值分布是否为正态(并且组内的值具有相似的正态分布)。variances).
  • Normality不是很重要;方差分析对于中等程度的非正态分布是稳健的(例如,参见here).
  • Log变换会在错误的方向上修改数据(即它会倾向于增加左偏度)。一般来说,修复这种左偏数据需要进行一种变换,比如升幂>1 (与对数或平方根变换相反),但当这些值远不为零时,通常不会有太大帮助。如果你担心,
  • 一些统计选项:
    • 非参数、基于秩的检验,如Kruskal-Wallis检验(基于秩的模拟1-way ANOVA )
    • 进行方差分析,但是使用基于排列的方法来测试序数模型的统计significance.
    • use,使用分层自举(在簇内和簇之间的替换内重采样)以在parameters

上导出更健壮的置信区间(

票数 4
EN

Stack Overflow用户

发布于 2018-11-18 06:52:57

您的变量遵循离散分布。您有从35 (n=2)到40 (n=30)的整数值。我认为您需要执行一些顺序分析,将值从35折叠到37,这些值在一个类别中具有较少的观察值。否则,您可以使用kruskal.test()函数执行非参数分析。

票数 2
EN

Stack Overflow用户

发布于 2018-11-22 01:22:40

我有坏消息和好消息。

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

加载包,调整默认值

代码语言:javascript
复制
library(ggplot2); theme_set(theme_bw())
library(dplyr)

检查数据结构

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

代码语言:javascript
复制
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值(并记录每个组的观察值)

代码语言:javascript
复制
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))

分析

现在我们已经聚合(不会丢失任何我们关心的信息),我们可以使用线性回归,其权重指定了每个观察值的样本数量:

代码语言:javascript
复制
m1 <- lm(temp.max~growth.chamber*environment,weights=n,
         data=dda)

检查残差的分布等:

代码语言:javascript
复制
plot(m1)

这一切看起来都很好;没有迹象表明存在严重的偏差、异方差、非正态或异常值...

代码语言:javascript
复制
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))

虽然数据的曲线图看起来不仅仅是噪声,但统计分析表明,我们无法真正将其与噪声区分开来……

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53355879

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档