以下是我的数据
> x
day sum
1 2015-04-14 129
2 2015-04-15 129
3 2015-04-16 129
4 2015-04-17 899
5 2015-04-18 899
6 2015-04-19 899
7 2015-04-20 899
8 2015-04-21 899
9 2015-04-22 899
10 2015-04-23 899
11 2015-04-24 899
12 2015-04-25 899
13 2015-04-26 899
14 2015-04-27 899
15 2015-04-28 899
16 2015-04-29 899
17 2015-04-30 899
18 2015-05-01 899
19 2015-05-02 899
20 2015-05-03 899
21 2015-05-04 899
22 2015-05-05 899
23 2015-05-06 899
24 2015-05-07 899
25 2015-05-08 899
26 2015-05-09 899
27 2015-05-10 899
28 2015-05-11 899
29 2015-05-12 920
30 2015-05-13 920
31 2015-05-14 920
32 2015-05-15 920
33 2015-05-16 920
34 2015-05-17 920
35 2015-05-18 920
36 2015-05-19 920
37 2015-05-20 920
38 2015-05-21 920
39 2015-05-22 920
40 2015-05-23 920
41 2015-05-24 920
42 2015-05-25 920
43 2015-05-26 920
44 2015-05-27 920
45 2015-05-28 920
46 2015-05-29 920
47 2015-05-30 920
48 2015-05-31 920
49 2015-06-01 1076
我想进行回归分析,找出总和为6000的数据。我做了以下,
> q<-lm(day ~ sum, data=x)
> q
Call:
lm(formula = day ~ sum, data = x)
Coefficients:
(Intercept) sum
1.653e+04 3.584e-02
> as.Date(predict(q, data.frame(sum=6000)))
1
"2015-11-08"
我能够预测日期。但我不确定准确性,并希望改进它。但我无法查看回归的摘要。我收到以下错误,
> summary(q)
Error in Ops.difftime((f - mean(f)), 2) :
'^' not defined for "difftime" objects
以防万一,变量类型很重要,
> typeof(x)
[1] "list"
> typeof(x$day)
[1] "double"
> typeof(x$sum)
[1] "integer"
> class(x$day)
[1] "Date"
当我看一下之前的论坛时,
Difftime Error using Looping Regressions in R
以下是解决方案,
我通过将索引从时间值更改为标准整数索引来解决这个问题,一切运行正常。
但我不知道该怎么做?
有人可以帮我解决这个问题并说出我需要做些什么来获取摘要吗?
由于
答案 0 :(得分:1)
R
中的日期实际上只是根据某些规则重新转换为日期格式的数值。例如,Date
格式是自1970年1月1日以来经过的天数,POSIXct
格式是自1970年1月1日起参考UTC时区以来经过的秒数。以下是一些例子:
as.numeric(as.Date("1970-01-01", tz="UTC"))
# 0
as.numeric(as.Date("1970-01-05", tz="UTC"))
# 4
as.numeric(as.POSIXct("1970-01-01 00:00:00", tz="UTC"))
# 0
as.numeric(as.POSIXct("1970-01-05 00:00:00", tz="UTC"))
# 345600
解决问题的一种方法是将日期转换为数字格式,对数字数据运行回归,然后在结束时转换回日期。
在下面的代码中,我假设x$day
以POSIXct
格式开始。
# Convert POSIXct date to a numeric value equal to number of days since Jan 1, 1970
x$day.numeric = as.numeric(x$day)/(24*60*60)
# Regression model
q <- lm(day.numeric ~ sum, data=x)
summary(q)
Call:
lm(formula = day.numeric ~ sum, data = x)
Residuals:
Min 1Q Median 3Q Max
-22.253 -10.253 1.747 9.994 20.994
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 1.653e+04 8.448e+00 1956.996 < 2e-16 ***
sum 3.584e-02 9.550e-03 3.753 0.00048 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 12.67 on 47 degrees of freedom
Multiple R-squared: 0.2306, Adjusted R-squared: 0.2142
F-statistic: 14.09 on 1 and 47 DF, p-value: 0.0004796
# Predict date at which sum = 6000. Use as.Date to convert numeric value
# back to a date based on the number of days since Jan 1, 1970.
as.Date(predict(q, data.frame(sum=6000)), origin="1970-01-01")
1
"2015-11-08"