【问题标题】:Use list of models to calculate new values in a data.frame使用模型列表计算 data.frame 中的新值
【发布时间】:2013-12-16 20:59:04
【问题描述】:

使用 dlply (from this post;下面的代码)我能够在我的data.frame的子集上生成一个线性模型列表。现在我有了这个列表,我想使用模型在另一个 data.frame 中生成值。

该列表包含每个 DAYvariable 子集的模型。我想将该模型应用于另一个 data.frame 中的相同子集。例如,对于 DAY == 1 和变量 == Var.1,模型 (y = mx+b) 为 value = -4.521869(Location) + 21.315。使用适当子集的模型,我将在另一个 data.frame 中计算 Var.1 的值(例如,dat_rec 已经有 DAYLocation 的条目)。

有没有办法在另一个 data.frame 中的相同子集上使用列表中的模型(例如,使用DAY == 1 和 variable == Var.1 的模型来填充data.frame 无处不在[例如不同的Sites] DAY == 1 和variable == Var.1) 是否有类似的列表方法可以使用列表中的模型计算的值填充 data.frame?所需的最终产品(即下面的 dat_rec)是 data.frame。

# Data
dat <- structure(list(Site = c(32L, 32L, 32L, 32L, 10L, 10L, 10L, 10L, 
32L, 32L, 32L, 32L, 10L, 10L, 10L, 10L), Location = c(0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), DAY = c(5L, 
55L, 555L, 5555L, 5L, 55L, 555L, 5555L, 5L, 55L, 555L, 5555L, 
5L, 55L, 555L, 5555L), Var.1 = c(20.9, 20.8, 21.03, 21.36, 21.73, 
21.18, 20.73, 21.98, 21.73, 12.48702448, 12.19642662, 12.33218874, 
11.85626285, 11.88812108, 12.70549981, 11.89587521), Var.2 = c(100L, 
100L, 100L, 100L, 100L, 100L, 100L, 100L, 90L, 90L, 90L, 91L, 
92L, 88L, 89L, 90L), Var.3 = c(14.47, 14.4, 14.3, 14.14, 14.72, 
14.62, 14.14, 14.49, 10.27287765, 10.27287765, 10.41763527, 10.51725376, 
11.12918753, 10.81166867, 10.80656509, 11.00093898), Var.4 = c(890.19, 
888.9, 889.14, 888.15, 889.57, 888.41, 887.48, 886.87, 688.15, 
698.23, 650.99, 700.01, 699, 689.6, 658.7, 689.99)), .Names = c("Site", 
"Location", "DAY", "Var.1", "Var.2", "Var.3", "Var.4"), class = "data.frame", row.names = c(NA, 
-16L))

# melt data for use with dlply
mdat <- melt(dat, id=c("DAY", "Site", "Location"))

# this dlply solution was built from here https://stackoverflow.com/a/1214432/1670053
models_mdat <- dlply(mdat, c("DAY","variable"), function(df) 
                lm(value ~ Location, data = df))

# example (partial) result, with Var.1 filled in for two DAYs
# I've only filled in the values for Var.1 using the model from the list 
# for DAY 5 and 55.
# not melted
dat_rec <- structure(list(Site = c(1L, 1L, 1L, 1L, 3L, 3L, 3L, 3L), Location = c(0.1, 
0.2, 0.3, 0.4, 0.1, 0.2, 0.3, 0.4), DAY = c(5L, 5L, 5L, 5L, 55L, 
55L, 55L, 55L), Var.1 = c(20.8628131, 20.4106262, 19.9584393, 
19.5062524, 20.1097573, 19.2295146, 18.3492719, 17.4690292), 
    Var.2 = c(NA, NA, NA, NA, NA, NA, NA, NA), Var.3 = c(NA, 
    NA, NA, NA, NA, NA, NA, NA), Var.4 = c(NA, NA, NA, NA, NA, 
    NA, NA, NA)), .Names = c("Site", "Location", "DAY", "Var.1", 
"Var.2", "Var.3", "Var.4"), class = "data.frame", row.names = c(NA, 
-8L))
# melted
    dat_rec_melt <- structure(list(Site = c(1L, 1L, 1L, 1L, 3L, 3L, 3L, 3L, 1L, 1L, 
1L, 1L, 3L, 3L, 3L, 3L, 1L, 1L, 1L, 1L, 3L, 3L, 3L, 3L, 1L, 1L, 
1L, 1L, 3L, 3L, 3L, 3L), Location = c(0.1, 0.2, 0.3, 0.4, 0.1, 
0.2, 0.3, 0.4, 0.1, 0.2, 0.3, 0.4, 0.1, 0.2, 0.3, 0.4, 0.1, 0.2, 
0.3, 0.4, 0.1, 0.2, 0.3, 0.4, 0.1, 0.2, 0.3, 0.4, 0.1, 0.2, 0.3, 
0.4), DAY = c(5L, 5L, 5L, 5L, 55L, 55L, 55L, 55L, 5L, 5L, 5L, 
5L, 55L, 55L, 55L, 55L, 5L, 5L, 5L, 5L, 55L, 55L, 55L, 55L, 5L, 
5L, 5L, 5L, 55L, 55L, 55L, 55L), variable = structure(c(1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L), .Label = c("Var.1", 
"Var.2", "Var.3", "Var.4"), class = "factor"), value = c(20.8628131, 
20.4106262, 19.9584393, 19.5062524, 20.1097573, 19.2295146, 18.3492719, 
17.4690292, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA)), .Names = c("Site", 
"Location", "DAY", "variable", "value"), row.names = c(NA, -32L
), class = "data.frame")

【问题讨论】:

    标签: r list dataframe plyr reshape2


    【解决方案1】:

    我想你在找predict:

    sapply(models_mdat ,predict,newdata=dat_rec)
    

    EDIT 将结果与新数据对齐:

    lapply(models_mdat ,function(x)
           cbind(dat_rec,fit=predict(x,newdata=dat_rec)))
    

    【讨论】:

    • predict 似乎是我想要的。但是,是否可以使用apply 函数之一而丢失data_rec 中的其余信息?如上所述使用sapply 会导致解决方案不保留来自data_rec 的信息。如何从sapply 获取/保留信息以与data_rec 保持一致?
    • 谢谢。这更接近我在上面寻找的结果。我将继续阅读不同的apply 程序,看看我是否能找到与上述data_rec 近似的解决方案。模型列表用于构建 data.frame(例如 data_rec)或构建一个列表的结果。我不是想为模型列表中的每个模型构建一个单独的 list/data.frame,而是使用每个模型来构建一个。
    • 我不确定你在找什么,但也许你可以使用 res &lt;- lapply(models_mdat ,..) using do.call(cbind,res) 的组合结果
    • 我将探讨您最新评论中的建议。为了更清楚......我想要的最终产品是一个 data.frame 已经更新了从模型列表中包含的模型计算的值。模型列表是使用子集创建的,并且在更新 data.frame 时应使用这些相同的子集,例如DAY== 1 & variable == Var.1 的模型应该用于更新 data.frame,其值为 DAY == 1 & variable == Var.1 等跨度>
    【解决方案2】:

    使用来自 agstudy 的信息,predict 似乎是我正在寻找的用于计算模型值的工具。知道我想使用dlply 生成的模型列表来更新带有predictions 的data.frame,我对搜索什么以找到解决方案有了更好的了解。

    我在post 中找到了解决方案。为了获得我正在寻找的结果,我需要使用模型列表以及数据作为列表。然后 predict 可以与mdply 一起使用,最终得到一个更新的data.frame。

    # melted
        dat_rec_melt <- structure(list(Site = c(1L, 1L, 1L, 1L, 3L, 3L, 3L, 3L, 1L, 1L, 
    1L, 1L, 3L, 3L, 3L, 3L, 1L, 1L, 1L, 1L, 3L, 3L, 3L, 3L, 1L, 1L, 
    1L, 1L, 3L, 3L, 3L, 3L), Location = c(0.1, 0.2, 0.3, 0.4, 0.1, 
    0.2, 0.3, 0.4, 0.1, 0.2, 0.3, 0.4, 0.1, 0.2, 0.3, 0.4, 0.1, 0.2, 
    0.3, 0.4, 0.1, 0.2, 0.3, 0.4, 0.1, 0.2, 0.3, 0.4, 0.1, 0.2, 0.3, 
    0.4), DAY = c(5L, 5L, 5L, 5L, 55L, 55L, 55L, 55L, 5L, 5L, 5L, 
    5L, 55L, 55L, 55L, 55L, 5L, 5L, 5L, 5L, 55L, 55L, 55L, 55L, 5L, 
    5L, 5L, 5L, 55L, 55L, 55L, 55L), variable = structure(c(1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 
    3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L), .Label = c("Var.1", 
    "Var.2", "Var.3", "Var.4"), class = "factor"), value = c(20.8628131, 
    20.4106262, 19.9584393, 19.5062524, 20.1097573, 19.2295146, 18.3492719, 
    17.4690292, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
    NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA)), .Names = c("Site", 
    "Location", "DAY", "variable", "value"), row.names = c(NA, -32L
    ), class = "data.frame")
    
    dat_rec_list <- dlply(dat_rec_melt, c("DAY", "variable"))
    
    predictions <- mdply(cbind(mod = models_mdat, df = dat_rec_list), function(mod, df) {
      mutate(df, pred = predict(mod, newdata = df))
    })
    

    【讨论】:

      猜你喜欢
      • 2019-11-29
      • 2020-12-16
      • 2020-09-01
      • 2015-09-05
      • 1970-01-01
      • 2019-08-22
      • 2016-10-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多