创建线性或非线性模型的分组摘要以连接到表并预测值

问题描述

我有一个包含三列的表格:x 和 y,以及 id。我想为每个 id 创建一个线性模型。

   id  x  y
1   a  1  2
2   b  5 10
3   a  8 16
4   b  1  2
5   a  6 12
6   c  9 18
7   a  2  4
8   a  9 18
9   b  1  2
10  b  6 12
11  b 10 20
12  c 12 24
13  c  2  4
14  c  4  8
15  c  5 10

我可以使用 split/apply 或使用 nlme 的 lmList 函数来做到这一点。我究竟如何创建一个带有 id 的汇总表,并将其各自的线性模型存储在一个小的汇总表中? 另外,我如何将汇总表连接回上述数据框(或另一个带有 ID 列和 x 列的数据框)?那么,是否也可以使用连接的线性模型并使用给定行中的相应 x 值预测结果

# Representation of what it would look like to join and predict the linear model

   id  x  lm
1   a  1  <first lm here>
2   b  5 <second lm here>

是否可以使用上面的示例,使用给定 x 值的相应 lm 预测 y?这是否也可以扩展到其他模型,例如 knn3loess

解决方法

尝试使用这种方法。只要您知道 id 的顺序,您就可以在 tibble 中定义它们,并将它们各自的线性模型存储在列表列中。

进一步解释:定义 mapsummarydata$lm 命令根据 df1 的值将 id 拆分为三个独立的数据帧,然后为这些数据帧中的每一个拟合线性模型。然后将生成的模型对象存储在 summarydata$lm 中。

library(tidyverse)

# Reproducing your data
df1 <- tibble(
  id = c("a","b","a","c","c"),x = c(1,5,8,1,6,9,2,10,12,4,5),y = c(2,20,26,18,24,10)
)

summarydata <- tibble(
  id = c("a",7),lm = map(group_split(df1,id),~ lm(y ~ x,data = .))
)

然后,为了从每个线性模型中获得预测,我们可以在 mutate 中使用另一个 map 命令。这从 x 获取每个线性模型和 summarydata 的每个值,并使用 predict 计算 y 的预测值。

summarydata %>%
  mutate(
    prediction = map2_dbl(lm,x,~ predict(.x,newdata = tibble(x = .y)))
  )

输出:

# A tibble: 3 x 4
  id        x lm     prediction
  <chr> <dbl> <list>      <dbl>
1 a         1 <lm>         1.69
2 b         5 <lm>        12.0 
3 c         7 <lm>        14