2

So a few days ago I asked a question about how to predict using the tslm function.

Forecasting with `tslm` returning dimension error

It turns out that I was passing the function without any new data to predict from and so I was getting errors.

However, I now have some new data and I'm still struggling, I'm getting the same error that I was before even though I am passing in new data. I'm aware of the issue that can arise from not creating proper data frames so, I have turned everything into a data frame.

Here is some R code that is very similar to what I have tried:-

library("forecast")
ts.in <- ts(input) #data vector for input shown below question
ts.out <- ts(output) #data vector for output variable shown below question


df.oldData <- data.frame(ts.in, ts.out)

new.ts <- ts(newInput) # these are my projected values

df.newData <- data.frame(new.ts)

fit1 <- tslm(ts.out ~ ts.in)

projection <- forecast.lm(fit1, newdata = df.newData)

but I am still getting dimension errors:-

Error in forecast.lm(fit1, newdata = df.newData) : 
  Variables not found in newdata
In addition: Warning messages:
1: 'newdata' had 10 rows but variables found have 696 rows 
2: 'newdata' had 10 rows but variables found have 696 rows 

How can I get R to see the new data and predict properly? I'm at my wits end. I still get dimension errors even if I just paste the new data on to the original data and split the data set into 2 pieces by rows.

Some example data is provided below.

here's the dput of the input variable and output data as a data.frame of time series:-

>dput(df.oldData)

structure(list(ts.in = structure(c(0, 22, 0, 145, 113, 118, 155, 
323, 103, 151, 311, 143, 106, 25, 3, 0, 4, 0, 4, 0, 0, 0, 0, 
0, 0, 0, 0, 96, 128, 229, 112, 159, 154, 70, 260, 110, 12, 56, 
6, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 144, 102, 320, 168, 83, 
409, 203, 235, 83, 134, 195, 59, 0, 5, 0, 5, 0, 0, 0, 0, 0, 0, 
0, 0, 259, 165, 101, 211, 387, 185, 193, 314, 61, 82, 70, 52, 
0, 11, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 178, 236, 377, 169, 233, 
444, 303, 457, 325, 5, 102, 43, 0, 0, 4, 18, 0, 0, 0, 0, 0, 4, 
0, 2, 139, 744, 319, 618, 265, 387, 672, 366, 273, 527, 55, 8, 
0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 146, 256, 189, 201, 204, 
383, 399, 177, 151, 38, 20, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 145, 103, 172, 172, 277, 253, 153, 393, 97, 188, 42, 0, 21, 
6, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 152, 124, 249, 254, 206, 242, 
138, 307, 349, 63, 336, 118, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 97, 78, 134, 101, 177, 246, 316, 315, 158, 24, 62, 4, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 136, 118, 187, 181, 179, 143, 
165, 184, 228, 54, 0, 0, 5, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 292, 
232, 283, 323, 159, 190, 187, 137, 148, 22, 174, 57, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 8, 88, 341, 564, 263, 102, 348, 234, 
154, 208, 135, 17, 11, 0, 5, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 95, 
154, 188, 111, 158, 499, 678, 266, 249, 128, 132, 29, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 20, 0, 49, 60, 46, 106, 179, 487, 203, 266, 
49, 25, 46, 0, 4, 3, 6, 1, 0, 0, 0, 0, 0, 0, 0, 0, 93, 98, 145, 
265, 56, 227, 178, 179, 244, 13, 150, 33, 47, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 132, 225, 106, 165, 259, 110, 430, 457, 29, 
4, 2, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 87, 225, 338, 185, 
129, 316, 437, 561, 321, 46, 218, 53, 0, 0, 18, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 111, 226, 580, 271, 235, 128, 210, 534, 218, 232, 
28, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 151, 446, 305, 152, 
213, 223, 392, 280, 132, 320, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 479, 599, 465, 290, 560, 977, 963, 1062, 1240, 138, 
819, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 200, 178, 378, 116, 
180, 159, 225, 507, 155, 270, 392, 17, 0, 0, 9, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 191, 140, 175, 208, 244, 374, 193, 344, 799, 573, 
54, 5, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 6, 0, 223, 274, 184, 252, 
538, 381, 160, 558, 336, 205, 233, 49, 0, 0, 0, 8, 0, 0, 0, 0, 
0, 0, 2, 4, 283, 177, 157, 532, 214, 311, 508, 440, 481, 139, 
422, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 296, 413, 392, 295, 
285, 189, 371, 819, 444, 110, 56, 4, 0, 0, 0, 6, 0, 0, 0, 0, 
0, 5, 0, 0, 433, 368, 299, 295, 372, 531, 534, 471, 254, 51, 
2, 5, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 13, 29, 110, 83, 102, 115, 
123, 254, 130, 233, 288, 117, 14, 11, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 51, 34, 39, 85, 113, 132, 154, 334, 138, 132, 117, 17, 
76, 70, 0, 0, 0, 0, 0, 0, 0, 0), .Tsp = c(1, 696, 1), class = "ts"), 
    ts.out = structure(c(115, 331, 558, 867, 1066, 1172, 1212, 
    1214, 1175, 992, 1077, 1054, 1192, 1257, 1746, 1781, 1525, 
    606, 329, 117, 57, 74, 38, 82, 182, 313, 478, 762, 950, 1120, 
    1511, 1549, 1501, 1483, 1637, 1369, 1414, 1795, 1958, 2176, 
    1843, 879, 365, 165, 122, 103, 66, 88, 184, 2053, 1951, 2253, 
    2235, 2053, 2020, 1976, 1879, 1657, 1750, 1770, 1615, 1777, 
    2247, 2079, 1643, 1004, 405, 179, 66, 80, 54, 82, 239, 415, 
    703, 983, 1246, 1255, 1467, 1660, 1605, 1290, 1388, 1193, 
    1174, 1218, 1462, 1524, 1124, 831, 360, 173, 115, 61, 50, 
    76, 168, 385, 911, 1096, 1327, 1459, 1449, 1450, 1630, 1622, 
    1697, 1913, 1520, 1253, 1411, 1221, 911, 619, 408, 200, 63, 
    81, 58, 66, 106, 343, 719, 1204, 1668, 1680, 1698, 1473, 
    1583, 1808, 1988, 2124, 2010, 2220, 2413, 2024, 1436, 852, 
    292, 125, 92, 92, 67, 88, 195, 1124, 1493, 1797, 1850, 1844, 
    1800, 2131, 1723, 1554, 1814, 1762, 1756, 2037, 2639, 2511, 
    1957, 875, 435, 160, 85, 58, 56, 104, 230, 462, 704, 969, 
    1318, 1337, 1366, 1665, 1461, 1500, 1391, 1306, 1281, 1593, 
    2020, 2046, 1633, 838, 339, 158, 78, 54, 57, 79, 171, 398, 
    624, 952, 1110, 1224, 1248, 1246, 1184, 1096, 1261, 1093, 
    1129, 1323, 1650, 1927, 1648, 809, 330, 116, 86, 72, 46, 
    99, 154, 365, 637, 818, 1067, 1037, 1156, 1275, 1009, 1046, 
    1225, 1232, 1111, 1347, 1693, 1677, 1367, 791, 240, 123, 
    82, 94, 70, 115, 217, 434, 586, 951, 987, 1133, 1023, 1087, 
    1174, 1063, 1079, 948, 975, 1058, 1194, 1143, 982, 588, 328, 
    168, 81, 34, 57, 69, 156, 436, 670, 931, 1082, 1074, 944, 
    883, 1014, 1093, 1010, 1169, 860, 846, 1033, 998, 979, 594, 
    291, 142, 72, 59, 48, 65, 118, 394, 778, 1048, 1152, 1268, 
    1375, 1159, 1076, 1361, 1487, 1676, 1523, 1941, 2201, 2254, 
    1597, 672, 264, 127, 78, 31, 53, 98, 178, 1378, 1541, 1870, 
    2016, 1869, 2114, 2373, 2041, 1877, 2066, 1707, 1668, 2327, 
    3088, 2818, 2395, 1155, 439, 156, 109, 83, 58, 113, 282, 
    521, 830, 1219, 1598, 1844, 1795, 2003, 1728, 1905, 1528, 
    1568, 1467, 1863, 2619, 2668, 2070, 1094, 413, 129, 70, 59, 
    37, 118, 206, 585, 817, 1243, 1418, 1421, 1400, 1507, 1399, 
    1309, 1374, 1408, 1216, 1421, 1932, 2277, 1636, 895, 302, 
    157, 82, 70, 73, 70, 181, 470, 673, 1118, 1331, 1425, 1428, 
    1536, 1453, 1442, 1517, 1316, 1285, 1400, 1730, 1712, 1646, 
    805, 291, 169, 112, 80, 50, 75, 257, 374, 694, 1182, 1222, 
    1268, 1253, 1454, 1269, 1337, 1514, 1302, 1220, 1195, 1433, 
    1383, 1061, 740, 386, 161, 70, 89, 72, 73, 174, 979, 1594, 
    1903, 1797, 1963, 1863, 1767, 1804, 1933, 2015, 1771, 1647, 
    1526, 1540, 1344, 1154, 661, 370, 224, 117, 58, 66, 70, 136, 
    337, 806, 1141, 1747, 1691, 1762, 1468, 1529, 1645, 1668, 
    1565, 1894, 1565, 1758, 1653, 1291, 810, 311, 147, 107, 67, 
    95, 88, 164, 337, 797, 1419, 1920, 2187, 2149, 1868, 2092, 
    2343, 2379, 2765, 2230, 2305, 2633, 2286, 1667, 800, 358, 
    142, 86, 43, 41, 124, 141, 1149, 1534, 2058, 2083, 2004, 
    2253, 2223, 2081, 2131, 2247, 1937, 1964, 2301, 2577, 2444, 
    1957, 954, 509, 204, 91, 54, 64, 87, 196, 423, 906, 1412, 
    1540, 1695, 1632, 1805, 1637, 1774, 1762, 1727, 1697, 1914, 
    2217, 2354, 1810, 976, 486, 233, 98, 88, 77, 126, 166, 454, 
    832, 1279, 1638, 1709, 1672, 1839, 1607, 2451, 5066, 4860, 
    4496, 5362, 6230, 6373, 4830, 2555, 1366, 405, 315, 196, 
    188, 221, 458, 1280, 2157, 3170, 3420, 3983, 4142, 4126, 
    3814, 4263, 3947, 3840, 3632, 4006, 4274, 4160, 4068, 2180, 
    1073, 537, 326, 164, 228, 276, 515, 1149, 2056, 3350, 3617, 
    3645, 3258, 3326, 3130, 3795, 3984, 4140, 3255, 3332, 3965, 
    3479, 2927, 1855, 968, 448, 280, 110, 134, 216, 413, 937, 
    2065, 3290, 4263, 4392, 4091, 4200, 4479, 4567, 5086, 5749, 
    5339, 6093, 6957, 6898, 4582, 2386, 1038, 356, 260, 222, 
    191, 301, 468, 3184, 4062, 4982, 5516, 5382, 5829, 5915, 
    5983, 4826, 5443, 5758, 6113, 6609, 8605, 7956, 6102, 3105, 
    1341, 453, 169, 189, 151, 305, 305, 686, 1314, 2146, 3674, 
    4702, 4444, 4913, 5196, 4148, 4380, 4432, 4413, 4558, 5131, 
    6462, 6775, 5836, 2948, 1125, 495, 222, 126, 138), .Tsp = c(1, 
    696, 1), class = "ts")), .Names = c("ts.in", "ts.out"), row.names = c(NA, 
-696L), class = "data.frame")

and then here's some projected values for the input data:-

> dput(df.newData)
structure(list(new.ts = structure(c(52, 79, 105, 130, 151, 167, 
179, 185, 186, 182), .Tsp = c(1, 10, 1), class = "ts")), .Names = "new.ts", row.names = c(NA, 
-10L), class = "data.frame")
Community
  • 1
  • 1
Simon Hayward
  • 694
  • 11
  • 26
  • Please edit your question to include the data using the output of `dput(data)` so that it can be copied and pasted easily. Also, you might be able to reduce the data to make a real _minimal_ [reproducible example](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example). – talat Jun 25 '14 at 19:54
  • I've never encountered dput before! I'll take a look. – Simon Hayward Jun 25 '14 at 19:55
  • I don't see the code you used to call `tslm`. Can you add that as well? How did you try passing "newdata"? – MrFlick Jun 25 '14 at 19:55
  • @SimonHayward MrFlick already took care of that now, but for future questions, it's in most cases a good practice to use `dput` as explained in the link I posted in the first comment. – talat Jun 25 '14 at 19:58
  • Hi, I've attempted to improve the question, please shout if you think it needs something more. – Simon Hayward Jun 25 '14 at 20:05
  • The output from `dput()` is awfully long and contains some information that doesn't seem relevant, is it still preferable to just using the data vectors themselves? – Simon Hayward Jun 25 '14 at 20:09
  • 1
    Yes, it is preferable, because anyone can simply copy and paste all of it into their console and end up with exactly the data (including the structure/class) of the data you were working on. – talat Jun 25 '14 at 21:15

1 Answers1

3

When you do a prediction the names of all the columns used as predictors in the model must be the same as the column in the new data.

Using your sample data.frames above, this should work

#change name to match the model data
names(df.newData)<-"ts.in"

#this should be true
# > names(df.oldData)
# [1] "ts.in"  "ts.out"
# > names(df.newData)
# [1] "ts.in"


#use formala syntax with data.frame and correct variable names
fit1 <- tslm(ts.out ~ ts.in, df.oldData)

#now predict using ts.in values from df.newData
projection <- forecast.lm(fit1, newdata = df.newData)
MrFlick
  • 195,160
  • 17
  • 277
  • 295