以下是我的数据
day sum
2015-03-05 44
2015-03-06 46
2015-03-06 48
2015-03-07 48
2015-03-08 58
2015-03-09 58
2015-03-10 66
2015-03-11 68
2015-03-12 85
2015-03-13 94
2015-03-14 98
2015-03-15 102
2015-03-16 102
2015-03-17 104
2015-03-17 114
使用的变量类型如下,
typeof(x)
[1] "list"
typeof(x$day)
[1] "double"
typeof(x$sum)
[1] "integer"
class(x$day)
[1] "Date"
我想预测,在什么日期,可以获得特定金额。
以下是我的发现,
当我使用回归分析时,
q<-lm((as.POSIXct(x$day,"%Y-%m-%d"))~x$sum)
> predict(q,data.frame(x$sum==3000))
它会抛出一些随机值,如下所示,
1 2 3 4 5 6 7 8
1426062187 1426062187 1426062187 1426062187 1426062187 1426062187 1426062187 1426062187
9 10 11 12 13 14 15 16
1426062187 1426062187 1426062187 1426062187 1426062187 1426062187 1426062187 1426062187
17 18 19 20 21 22 23 24
1426062187 1426062187 1426062187 1426062187 1426062187 1426062187 1426062187 1426062187
25 26 27 28 29 30 31 32
1426062187 1426062187 1426062187 1426062187 1426062187 1426062187 1426062187 1426062187
33 34 35 36 37 38 39 40
1426062187 1426062187 1426062187 1426062187 1426074330 1426086474 1426086474 1426147192
当我使用ts(x)时,日期的值会发生如下变化,
day
16464
16465
16466
16467
16468
16469
16470
16471
16472
当我使用ets时,以下是输出,
fit <- ets(x)
Error in ets(ana) : y should be a univariate time series
有人可以建议我在这里做错了,为什么我不能在这里使用任何模型?
由于
答案 0 :(得分:1)
R中日期的基础值是数值。您所看到的不是随机值,而是两种不同日期格式的day
的数值。
如果day
为POSIXct格式,则该值为自1970年1月1日以来的秒数。如果day
为日期格式,则该值为自1月1日以来的天数,1970年。例如:
x$day = as.POSIXct(x$day)
as.numeric(x$day)
[1] 1425542400 1425628800 1425628800 1425715200 ...
as.numeric(as.Date(x$day))
[1] 16499 16500 16500 16501 16502 ...
这里有一些代码可以进行回归并以日期格式绘制。为保持一致性,您必须小心确保原点(参考时间)和时区始终相同:
# Set x$day to POSIXct format, with time zone UTC
x$day = as.POSIXct(x$day, tz="UTC")
# Regression model predicting day from sum
q<-lm(day ~ sum, data=x)
# Plot day vs. sum and add regression line and a point prediction
plot(x$sum, x$day, las=1, ylab="", xlab="Sum",
xlim=c(40, 120), ylim=c(min(x$day), predict(q, data.frame(sum=120))))
lines(x$sum, as.POSIXct(predict(q), origin="1970-01-01 00:00:00 UTC", tz="UTC"),
col="red")
points(120, predict(q, data.frame(sum=120)), pch=16, col="blue")