簡體   English   中英

繪制最小二乘平均值表示因子水平組

[英]Plot least-squares means for groups of factor levels

我正在尋找一種簡單的方法來提取(和繪制)一個因子的指定水平組合的最小二乘平均值,用於另一個因子的每個級別。

示例數據:

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 ,所有數據都應該在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

我期待着聽到您的意見或建議。 謝謝!

另一種方法是計算感興趣的組平均值的對比度系數,以及您在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函數。

關注@ 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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM