【问题标题】:Plot predicted values of linear mixed model over the observed values?在观测值上绘制线性混合模型的预测值?
【发布时间】:2021-11-20 13:24:43
【问题描述】:

我对连续结果进行了重复测量,如下所示:

library(magrittr)
library(ggplot2)
library(nlme)
mydata <- structure(list(ID = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 
3L, 3L, 3L, 3L, 3L, 4L, 4L, 5L, 5L, 5L, 6L, 6L, 6L, 6L, 6L, 7L, 
7L, 7L, 7L, 7L, 8L, 8L, 9L, 9L, 10L, 10L, 11L, 11L, 11L, 11L, 
12L, 12L, 13L, 13L, 14L, 14L, 14L, 14L, 14L, 15L, 15L, 16L, 16L, 
17L, 17L, 17L, 17L, 17L, 18L, 18L, 19L, 19L, 20L, 20L, 21L, 21L, 
22L, 22L, 22L, 22L, 22L, 23L, 23L, 24L, 24L, 24L, 24L), .Label = c("2", 
"3", "4", "7", "8", "13", "14", "20", "21", "22", "24", "25", 
"27", "29", "30", "31", "34", "36", "37", "38", "39", "40", "48", 
"49", "50", "51", "52", "54", "58", "60", "61", "65", "74", "75", 
"76", "77", "80", "81", "82", "83", "84", "86", "87", "88", "92", 
"94", "95", "96", "103", "104", "105", "114", "115", "116", "117", 
"119", "125", "126", "127", "132", "134", "135", "137", "138", 
"141", "142", "145", "152", "153", "154", "157", "159", "160", 
"162", "164", "165", "171", "172", "179", "180", "184", "185", 
"189", "194", "195", "197", "198", "202", "203", "205", "209", 
"213", "221", "253", "255", "258", "262", "271", "273", "277", 
"279", "310", "315", "320"), class = "factor"), date_ct = structure(c(15923, 
16122, 16715, 16902, 17086, 18003, 16150, 16841, 16421, 16764, 
16951, 17135, 18011, 16622, 18247, 16582, 16752, 18045, 16729, 
16862, 17042, 17226, 18102, 16568, 16736, 16916, 17100, 18040, 
16743, 16841, 16589, 16729, 16526, 16729, 16619, 16862, 17042, 
17226, 16407, 18437, 16512, 16953, 16457, 16946, 17112, 17310, 
17989, 16573, 16841, 15923, 16752, 16505, 16729, 16909, 17107, 
18038, 16540, 16743, 15951, 16122, 16624, 18202, 16623, 18221, 
16694, 16715, 16902, 17086, 18037, 16451, 16743, 16421, 16736, 
16909, 17100), class = "Date"), age = c(56.6, 57.1, 58.8, 59.3, 
59.8, 62.3, 43.2, 45.1, 52, 52.9, 53.4, 53.9, 56.3, 58.5, 63, 
57.4, 57.9, 61.4, 57.8, 58.2, 58.7, 59.2, 61.6, 52.4, 52.8, 53.3, 
53.8, 56.4, 70.8, 71.1, 61.4, 61.8, 59.2, 59.8, 61.5, 62.2, 62.7, 
63.2, 48.9, 54.5, 54.2, 55.4, 50.1, 51.4, 51.8, 52.4, 54.3, 55.4, 
56.1, 48.6, 50.9, 64.2, 64.8, 65.3, 65.8, 68.4, 68.3, 68.8, 66.7, 
67.1, 60.5, 64.8, 56.5, 60.9, 62.7, 62.8, 63.3, 63.8, 66.4, 49, 
49.8, 61, 61.8, 62.3, 62.8), continuous_outcome = c(1636.4, 544.1, 
1408, 1594.7, 1719.4, 2345.9, 115.3, 226, 2678.2, 3451.6, 3702.7, 
3632.7, 5805, 155.2, 1095, 992.2, 296.6, 2020.4, 3708.6, 2710.7, 
2934.2, 3080.4, 4489.7, 3459.4, 4965.3, 5553.1, 5037.8, 7315.7, 
29980.8, 35407.5, 2263.2, 2060.6, 3220.7, 4467.1, 5902.3, 6407.2, 
5947.1, 6271.6, 306, 689.3, 1430.6, 1672.1, 9.9, 58.7, 69.9, 
125.3, 39.5, 3842.5, 5136.3, 216.6, 332.4, 5719.3, 5386, 5490.7, 
5268.2, 6166.7, 12520.6, 12981.8, 2896.1, 2976.8, 5495.6, 6470.6, 
4235.5, 7603.5, 3887, 3344.5, 2885.7, 3324.1, 6401, 1942.2, 2000.9, 
2401.7, 2231.5, 2749.7, 2741.7)), row.names = c(NA, -75L), class = c("tbl_df", 
"tbl", "data.frame"))

通过探索性分析,我发现具有 2 个结的样条曲线运行以下线性混合模型,以确定年龄是否是我的结果的预测指标:

model1 <- 
   lme(data=mydata, 
      fixed=continuous_outcome ~ age, 
      random=~1|ID)

我想找到一种方法,将这个模型的预测值绘制成我的结果的观察值。有什么帮助吗?

【问题讨论】:

  • 您应该可以使用predict。例如,要获取情节:plot(mydata$continuous_outcome, predict(model1))

标签: r lme4 mixed-models nlme


【解决方案1】:

predict() 是基本答案。有更复杂的方法使用ggeffects 包(但它似乎不适用于lme 模型?)或sjPlot(但覆盖数据不是超级容易?)

model1 <-
   lme(data=mydata,
      fixed=continuous_outcome ~ splines::ns(age, 2),
      random=~1|ID)

构建预测数据框:此步骤并非总是必要的,但如果您的数据点不唯一或无序,或者您想要绘制非线性响应或置信区间 [通常是曲线],或者如果您有一个非常大的数据集(在这种情况下,可能不需要对整个数据集进行预测);如果您有一个带有非焦点预测器的更复杂的模型,这通常也是必要的(effects/ggeffects 包旨在自动执行此步骤)。

pframe <- data.frame(age=seq(min(mydata$age), max(mydata$age), length.out=101))

使用newdata 指定要进行预测的值,并使用level=0 在总体级别进行预测(这也意味着我们不需要在newlevels 中提供ID 值)

pframe$continuous_outcome <- predict(model1, newdata = pframe, level = 0)
ggplot(mydata, aes(age, continuous_outcome)) + 
  geom_point() +
  geom_line(data=pframe)

【讨论】:

  • 嗨@Ben Bolker。感谢您的回答。我对您的两行代码感到困惑: 1. pframe &lt;- data.frame(age=seq(min(mydata$age), max(mydata$age), length.out=101)) 到底是做什么的?仅根据年龄的最小值和最大值制作一个新的数据框?我不能将预测值添加到我的原始数据集mydata 中吗? 2.pframe$continuous_outcome &lt;- predict(model1, newdata = pframe, level = 0)中的newdata和level参数有什么作用?再次感谢!
  • 我想我已经在我的编辑中回答了你的问题。
  • 非常感谢您的解释。有些事情对我来说还不是很清楚:所以我要做的是创建一个新的数据框,其中包含原始数据集的最小和最大年龄之间的随机数(使用seq),然后将预测值添加到该数据中.如果我也有例如变量性别怎么办。我是否在我的模型中将相同性别因素的随机序列添加到预测数据集pframe,例如通过添加sex=sample(mydata$sex, size=101?第二个问题是,predict函数中的level=0是做什么的?
  • (1) seq() 不使用随机数(尽管你可以说“任意”); (2) 如果你有非焦点变量,一切都会变得更加复杂。你可以画两条单独的线;您可以平均男性和女性的值;等等。解决这些复杂性是 emmeanssjPlotggeffects 等软件包的用途:您可能不想重新发明它。 (3) 我已经回答了这个问题——它是在人口水平(“平均”组)而不是在个别群体的水平上进行预测
猜你喜欢
  • 2018-10-22
  • 2021-12-30
  • 1970-01-01
  • 2021-03-06
  • 2022-01-13
  • 1970-01-01
  • 1970-01-01
  • 2016-07-12
  • 2015-04-22
相关资源
最近更新 更多