检验线性模型中多个因子水平的斜率显着性

机器算法验证 r 线性的
2022-03-31 13:12:26

我在培养皿中生长了 6 种真菌(直径 = 直径 [cm])。

zz <- "
day SP516   SP621   PR9638  SP9885  SP9839  SP8345
1   0.5825  0.6275  0.86    0.875   0.69    0.62
2   1.3425  1.44    1.79    1.3725  1.61    1.1825
3   2.4025  2.5525  2.715   1.6325  2.6925  1.7475
4   3.55    3.4625  3.69    1.87    3.46    2.2575
5   4.7725  4.4 4.79    2.135   4.225   2.7825
6   5.8975  5.3075  5.9075  2.3525  5.065   3.39
7   6.92    6.2925  6.8425  2.5975  6.04    3.975"

df <- read.table(text=zz, header = TRUE)

long = reshape2::melt(df, id.vars = "day",
            variable.name="race", value.name="diam") 

ggplot2::ggplot(long, aes(x = day, y = diam, color=race)) +  
    geom_point() + stat_smooth(method="lm", se=F)    

连续下坡

我想知道他们的增长率在统计上是否不同。我怎么能测试它?所有种族在 0 天的直径都是 0.5,那里的截距可以强制为 0.5 厘米。

4个回答

这取决于您所说的统计差异是什么意思。统计学上不一样?

看看你的情节,你有四个看起来很明显相同,然后两个大不相同。所以,如果你运行:

library(lme4)
summary(lmer(diam~day*race + (1+day|race), data=long))

你得到,部分:

Fixed effects:
               Estimate Std. Error t value
(Intercept)    -0.71786    0.11409  -6.292
day             1.08902    0.11022   9.880
raceSP621       0.36143    0.16135   2.240
racePR9638      0.48036    0.16135   2.977
raceSP9885      1.46143    0.16135   9.057
raceSP9839      0.61643    0.16135   3.820
raceSP8345      0.78071    0.16135   4.839
day:raceSP621  -0.13982    0.15588  -0.897
day:racePR9638 -0.07982    0.15588  -0.512
day:raceSP9885 -0.81652    0.15588  -5.238
day:raceSP9839 -0.21429    0.15588  -1.375
day:raceSP8345 -0.53491    0.15588  -3.432

lmer没有给出 p 值,因为计算这些模型的自由度并不完全简单,但是查看 t 值,您可以看到day:SP9885交互作用和day:SP8345相互作用。这表明这两个条件的斜率比其他条件的斜率更浅。

从技术上讲,这是将SP516组视为基线,并测试其他所有内容的差异。

如果您想将不同的组设置为基线,您可以运行:

long$race <- relevel(long$race, ref='SP9885')
summary(lmer(diam~day*race + (1+day|race), data=long))

截断输出:

Fixed effects:
               Estimate Std. Error t value
(Intercept)      0.7436     0.1176   6.324
day              0.2725     0.1086   2.508
raceSP516       -1.4614     0.1663  -8.789
raceSP621       -1.1000     0.1663  -6.615
racePR9638      -0.9811     0.1663  -5.900
raceSP9839      -0.8450     0.1663  -5.082
raceSP8345      -0.6807     0.1663  -4.094
day:raceSP516    0.8165     0.1536   5.314
day:raceSP621    0.6767     0.1536   4.404
day:racePR9638   0.7367     0.1536   4.795
day:raceSP9839   0.6022     0.1536   3.920
day:raceSP8345   0.2816     0.1536   1.833

如果您正在寻找 p 值,您可以查看此常见问题解答

编辑:

在这里使用多级模型,因为我假设跨天的观察对于每个真菌种族都不是独立的。因此,您已经嵌套了数据。

鉴于您的问题下的评论,这是我会做的:

## GENERATE SOME EXAMPLE DATA
set.seed(127)
d <- data.frame(
  plate = rep(c(1:10), 42, each = 2),
  strain = rep(c(letters[1:6]), 7, each = 20),
  day = rep(c(1:7), each = 120),
  diameter = rnorm(840, 6, 3)
  )

require(ggplot2) 
ggplot(d, aes(x = day, y = diameter)) + geom_point() + 
  geom_smooth(method = "lm") + facet_wrap(~strain)

require(lme4)
fit <- lmer(diameter ~ strain * day + (1|strain/plate), data = d)
summary(fit)

不要忘记检查模型是否符合方差相等的假设

plot(fit)
boxplot(residuals(fit) ~ d$strain + d$day)

随机效应(1|strain/plate)扩大到(1|strain) + (1|strain:plate)如果你平均你的板块测量,你可以做到(1|strain)如果你想要随机的斜率,DayStrain可以分别做(day|strain/plate)(day|strain)

要获得 ANOVA 表:

require(afex)
mixed(diameter ~ strain * day + (1|strain/plate), data = d, method='LRT')

其余的取决于您的哪些因素是重要的。如果您的互动很重要,请参阅此处了解潜在的后续行动。

对于每个菌株进行多个实验重复,您可以使用 ANOVA 来测试斜率(增长率)是否在统计上不同。ANOVA 将告诉您样本组之间是否存在显着差异,而不是哪些菌株不同。为此,您可能需要使用多范围检验来比较均值。


编辑:

您可以对每个菌株的生长进行线性回归以获得总体生长速率(日系数的估计值):

lm.SP516<-lm(df$SP516~df$day)
summary(lm.SP516)

对每个菌株重复,并将值存储在向量“gr”(增长率)中。

使用菌株名称创建向量:

strain<-c(SP516,  SP621, PR9638, SP9885, SP9839, SP8345)

执行方差分析:

dat<-data.frame(strain,gr)

fit<-aov(dat$gr~dat$strain))
summary(fit)

当您想要测试斜率是否作为另一个变量的函数而不同时,您可以在模型中包含交互作用。当交互变量是连续的时,斜率线性变化,但你可以概括这是几种方法。当交互变量是分类变量时,它允许不同组中的不同斜率。见维基百科页面

https://en.wikipedia.org/wiki/Interaction_(统计)

了解更多信息。