【问题标题】:Match lists for use with PREDICT: list of lm() objects and list of data与 PREDICT 一起使用的匹配列表:lm() 对象列表和数据列表
【发布时间】:2013-12-20 20:52:57
【问题描述】:

我有 18 个日期(例如唯一的 DAYMONTHYEAR)和 10 个变量。对于每个日期和变量(180 个模型),我有一个 lm 模型(y = mx + b,其中 y = value 和 x = pLength)。这些存储在一个列表中(即models)。

我想使用这些模型来预测值。我有data.frame(接收值的data.frame)和以下列DAYMONTHYEARpLength,在这里我想预测每个日期的每个变量的值/ pLength 组合。

例如,如果模型适用于日期和变量组合 = 7.8.2013.Var1,那么对于 2013 年 8 月 7 日发生的每个 pLength,都应该有一个 Var1 的预测。

为此,我尝试使用从接收 data.frame 创建的另一个列表。此列表(即rec_List)是接收数据帧的 152 个拆分。这些拆分是 DAYMONTHYEARpLength 的唯一行。它们与上述相同的 18 个日期用不同的pLengths 分组。 pLengths 的值和数量因日期而异。

在我目前的方法中,我尝试使用来自另一个 post 的一些信息,尝试将列表与预测一起使用(但仅用于一个变量)。这对我不起作用。我没有按日期对每个 pLength 的每个变量进行预测,而是得到了一些随意的预测,总计 180 个,与模型的数量相同。

# Current Output  'preds'
X1            DAY MONTH YEAR pLength value
7.8.2013.Var1 7   8     2013 0.00    0.00
7.8.2013.Var2 7   8     2013 0.25    1.07  
7.8.2013.Var3 7   8     2013 0.33    6.25
etc 

# Desired Output
X1             DAY MONTH YEAR pLength value
7.8.2013.Var1  7   8     2013 0.00    0.00
7.8.2013.Var2  7   8     2013 0.00    1.10
7.8.2013.Var3  7   8     2013 0.00    6.55
...
7.8.2013.Var10 7   8     2013 0.00    100.10
7.9.2013.Var1  7   9     2013 0.25    0.00
7.9.2013.Var2  7   9     2013 0.25    1.15 
etc

当看到上面的当前输出时,我想我可以复制接收 data.frame 列表中的行,以便每个 DAYMONTHYEARpLength 被复制 10 次。这不起作用,但结果是这样。

# with duplicated rows
    X1              DAY     MONTH   YEAR    pLength         value
1   7.8.2013.Var1   7   8   2013    0.0000000   0.000000e+00
2   7.8.2013.Var1   7   8   2013    0.0000000   0.000000e+00
3   7.8.2013.Var1   7   8   2013    0.0000000   0.000000e+00
4   7.8.2013.Var1   7   8   2013    0.0000000   0.000000e+00
5   7.8.2013.Var1   7   8   2013    0.0000000   0.000000e+00
6   7.8.2013.Var1   7   8   2013    0.0000000   0.000000e+00
7   7.8.2013.Var1   7   8   2013    0.0000000   0.000000e+00
8   7.8.2013.Var1   7   8   2013    0.0000000   0.000000e+00
9   7.8.2013.Var1   7   8   2013    0.0000000   0.000000e+00
10  7.8.2013.Var1   7   8   2013    0.0000000   0.000000e+00
11  7.8.2013.Var2   7   8   2013    0.2500000   1.072500e+00

我希望 1 - 10 行是 7.8.2013 的 Var1-10 和 pLength = 0.00。

我知道问题可能在于我正在绑定不相等的列表来创建预测,但我不确定如何将模型列表与预测一起使用。我认为行重复会对此有所帮助。

简而言之:我想对 10 个变量中的每一个变量的每个日期和 pLength 组合进行预测。我试图用列表来做这件事,因为这是我目前在询问和阅读其他帖子后能想到的唯一方法。

# code with abbreviated data
require(plyr)
require(reshape2)
mdata2 <- structure(list(DAY = c(7L, 8L, 7L, 8L, 7L, 8L, 7L, 8L, 7L, 8L, 
7L, 8L, 7L, 8L, 7L, 8L, 7L, 8L, 7L, 8L, 7L, 8L, 7L, 8L, 7L, 8L, 
7L, 8L, 7L, 8L, 7L, 8L, 7L, 8L, 7L, 8L, 7L, 8L, 7L, 8L), MONTH = c(8L, 
6L, 8L, 6L, 8L, 6L, 8L, 6L, 8L, 6L, 8L, 6L, 8L, 6L, 8L, 6L, 8L, 
6L, 8L, 6L, 8L, 6L, 8L, 6L, 8L, 6L, 8L, 6L, 8L, 6L, 8L, 6L, 8L, 
6L, 8L, 6L, 8L, 6L, 8L, 6L), YEAR = c(2013L, 2012L, 2013L, 2012L, 
2013L, 2012L, 2013L, 2012L, 2013L, 2012L, 2013L, 2012L, 2013L, 
2012L, 2013L, 2012L, 2013L, 2012L, 2013L, 2012L, 2013L, 2012L, 
2013L, 2012L, 2013L, 2012L, 2013L, 2012L, 2013L, 2012L, 2013L, 
2012L, 2013L, 2012L, 2013L, 2012L, 2013L, 2012L, 2013L, 2012L
), pLength = c(1L, 1L, 0L, 0L, 1L, 1L, 0L, 0L, 1L, 1L, 0L, 0L, 
1L, 1L, 0L, 0L, 1L, 1L, 0L, 0L, 1L, 1L, 0L, 0L, 1L, 1L, 0L, 0L, 
1L, 1L, 0L, 0L, 1L, 1L, 0L, 0L, 1L, 1L, 0L, 0L), variable = structure(c(1L, 
1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 5L, 
5L, 5L, 5L, 6L, 6L, 6L, 6L, 7L, 7L, 7L, 7L, 8L, 8L, 8L, 8L, 9L, 
9L, 9L, 9L, 10L, 10L, 10L, 10L), .Label = c("Rain", "Wind", "WindD", 
"TempA", "TempF", "RH", "FuelM", "WindMax", "PAR", "VPD"), class = "factor"), 
    value = c(0, 0, 0, 0, 0.51, 1.096, 1.26, 1.472, 67.59440741, 
    0.153388889, 67.59440741, 0.153388889, 30.17, 31.73, 31.06, 
    31.78, 33.52, 46.9, 40.06, 43.66, 55.62, 27.81, 50.75, 27.82, 
    13.33, 0.842, 10.39, 5.783, 0.727, 1.58, 2.247, 2.234, 1105, 
    1740, 1767, 1969, 1.90257357, 3.351394626, 2.17506063, 3.373580125
    )), .Names = c("DAY", "MONTH", "YEAR", "pLength", "variable", 
"value"), row.names = c(1L, 2L, 19L, 20L, 37L, 38L, 55L, 56L, 
73L, 74L, 91L, 92L, 109L, 110L, 127L, 128L, 145L, 146L, 163L, 
164L, 181L, 182L, 199L, 200L, 217L, 218L, 235L, 236L, 253L, 254L, 
271L, 272L, 289L, 290L, 307L, 308L, 325L, 326L, 343L, 344L), class = "data.frame")

vs2 <- structure(list(DAY = c(8L, 8L, 8L, 8L, 8L, 8L, 7L, 7L, 7L, 7L, 
7L, 7L, 7L, 7L, 7L), MONTH = c(6L, 6L, 6L, 6L, 6L, 6L, 8L, 8L, 
8L, 8L, 8L, 8L, 8L, 8L, 8L), YEAR = c(2012L, 2012L, 2012L, 2012L, 
2012L, 2012L, 2013L, 2013L, 2013L, 2013L, 2013L, 2013L, 2013L, 
2013L, 2013L), pLength = c(0, 0.222222222, 0.444444444, 0.666666667, 
0.888888889, 1, 0, 0, 0.25, 0.333333333, 0.5, 0.75, 0.666666667, 
1, 1)), .Names = c("DAY", "MONTH", "YEAR", "pLength"), row.names = c("1:89", 
"1:90", "1:91", "1:92", "1:93", "1:94", "2:6", "2:23", "2:31", 
"2:39", "2:49", "2:69", "2:71", "2:87", "2:96"), class = "data.frame")

# ** code edited to reflect answer below **
models <- dlply(mdata2, c("variable", "DAY", "MONTH", "YEAR"), function(df) 
  lm(value ~ pLength, data = df))

rec_List <- dlply(unique(vs2), c("DAY", "MONTH", "YEAR"))

preds <- mdply(cbind(mod = models, df = rec_List), function(mod, df) {
  mutate(df, value = predict(mod, newdata = df))
})

【问题讨论】:

  • 这听起来像是 llply 的工作!

标签: r list plyr reshape2 predict


【解决方案1】:

问题在于,当两个列表为 cbinded 且不“匹配”时,它们的顺序不同。 model 列表是由 Day, Month, Year, variable 创建的,而 rec_List 是日、月、年。通过这种方式,rec_List 将在日期之间循环,并将 models 创建上面描述的不匹配。

通过改变这一行:

models <- dlply(mdata2, c("DAY", "MONTH", "YEAR", "variable"), function(df) 
  lm(value ~ pLength, data = df))

至此,variable

models <- dlply(mdata2, c("variable", "DAY", "MONTH", "YEAR"), function(df) 
  lm(value ~ pLength, data = df))

产生所需的输出。也就是说,每个日期/pLength 组合的每个变量都有预测。

【讨论】:

    猜你喜欢
    • 2012-01-19
    • 1970-01-01
    • 1970-01-01
    • 2012-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-26
    • 2013-12-23
    相关资源
    最近更新 更多