【问题标题】:Plot least-squares means for groups of factor levels绘制因子水平组的最小二乘均值
【发布时间】:2015-10-24 16:37:22
【问题描述】:

我正在寻找一种简单的方法来提取(和绘制)一个因子的指定水平组合的最小二乘均值,对于另一个因子的每个水平。

示例数据:

set.seed(1)
model.data <- data.frame(time = factor(paste0("day", rep(1:8, each = 16))),
  animal = factor(rep(1:16, each = 8)),
  tissue = factor(c("blood", "liver", "kidney", "brain")),
  value = runif(128)
  )

为因素“时间”设置自定义对比:

library("phia")
custom.contrasts <- as.data.frame(contrastCoefficients(
   time ~ (day1+day2+day3)/3 - (day4+day5+day6)/3,
   time ~ (day1+day2+day3)/3 - (day7+day8)/2,
   time ~ (day4+day5+day6)/3 - (day7+day8)/2,
   data = model.data, normalize = FALSE))

colnames(custom.contrasts) <- c("early - late",
  "early - very late",
  "late  - very late")

custom.contrasts.lsmc <- function(...) return(custom.contrasts)

拟合模型并计算最小二乘意味着:

library("lme4")
tissue.model <- lmer(value ~ time * tissue + (1|animal), model.data)
library("lsmeans")
tissue.lsm <- lsmeans(tissue.model, custom.contrasts ~ time | tissue)

绘图:

plot(tissue.lsm$lsmeans)
dev.new()
plot(tissue.lsm$contrasts)

现在,第二个图具有我想要的组合,但它显示了组合均值之间的差异,而不是均值本身。

我可以从tissue.lsm$lsmeans 获取各个值并自己计算组合均值,但我有一种烦人的感觉,即有一种我看不到的更简单的方法。毕竟,所有数据都应该在lsmobj 中。

early.mean.liver = mean(model.data$value[model.data$tissue == "liver" & 
  model.data$time %in% c("day1", "day2", "day3")])
late.mean.liver = mean(model.data$value[model.data$tissue == "liver" & 
  model.data$time %in% c("day4", "day5", "day6")])
vlate.mean.liver = mean(model.data$value[model.data$tissue == "liver" & 
  model.data$time %in% c("day7", "day8")])
# ... for each level of "tissue"


#compare to tissue.lsm$contrasts
early.mean.liver - late.mean.liver 
early.mean.liver - vlate.mean.liver
late.mean.liver - vlate.mean.liver

我期待听到您的 cmets 或建议。谢谢!

【问题讨论】:

  • 也许只需要创建第二个系数矩阵来获得每个组织的感兴趣的组合均值?
  • 感谢您的建议,@aosmith!不过,我不知道该怎么做——你能给我举个例子吗?

标签: r plot lme4 mixed-models lsmeans


【解决方案1】:

除了您在custom_contrasts 中计算的组均值差异的对比度系数之外,另一种方法是计算感兴趣组均值的对比度系数。例如,您可以使用 custom.contrasts2 单独执行此操作。

custom.contrasts2 <- as.data.frame(contrastCoefficients(
    time ~ (day1+day2+day3)/3,
    time ~ (day4+day5+day6)/3,
    time ~ (day7+day8)/2,
    data = model.data, normalize = FALSE))

colnames(custom.contrasts2) <- c("early",
                          "late",
                          "very late")

custom.contrasts2.lsmc <- function(...) return(custom.contrasts2)

lsmeans(tissue.model, custom.contrasts2 ~ time | tissue)$contrasts

这只是liver 的输出,它们是您所追求的组。

...
 tissue = liver:
 contrast    estimate         SE   df t.ratio p.value
 early      0.4481244 0.07902715 70.4   5.671  <.0001
 late       0.4618041 0.07902715 70.4   5.844  <.0001
 lvery late 0.3824247 0.09678810 70.4   3.951  0.0002

如果您知道组均值和组均值的差值都需要,您只需添加到通过contrastCoefficients 创建的对比度系数矩阵。

custom.contrasts <- as.data.frame(contrastCoefficients(
    time ~ (day1+day2+day3)/3,
    time ~ (day4+day5+day6)/3,
    time ~ (day7+day8)/2,
    time ~ (day1+day2+day3)/3 - (day4+day5+day6)/3,
    time ~ (day1+day2+day3)/3 - (day7+day8)/2,
    time ~ (day4+day5+day6)/3 - (day7+day8)/2,
    data = model.data, normalize = FALSE))

然后相应地命名并制作.lsmc 函数。

【讨论】:

  • 这正是我想要的!太感谢了!我不知道我可以使用这样的对比。
【解决方案2】:

以@aosmith 为例:

custom.means <- as.data.frame(contrastCoefficients(
   time ~ (day1+day2+day3)/3,
   time ~ (day4+day5+day6)/3,
   time ~ (day7+day8)/2,
   data = model.data, normalize = FALSE))

colnames(custom.means) <- c("early",
  "late",
  "very late")

custom.means.lsmc <- function(...) return(custom.means)

tissue.means <- confint(lsmeans(tissue.model, custom.means ~ time | tissue)$contrasts)

library("ggplot2")
p <- ggplot(tissue.means, 
  aes(x = contrast, y = estimate, ymin = lower.CL, ymax = upper.CL)) +
  geom_errorbar() + facet_wrap(~ tissue, ncol = 4) + xlab("time")

print(p)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-28
    • 1970-01-01
    • 2021-09-08
    • 2023-04-01
    • 2021-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多