The date
变量不会自动转换为数值变量;你需要自己做这件事。我通常按如下方式处理此类信息
mydata <- transform(mydata, ndate = as.numeric(date),
nyear = as.numeric(format(date, '%Y')),
nmonth = as.numeric(format(date, '%m')),
doy = as.numeric(format(date, '%j')))
然后我可以选择通过多种方式对时间分量进行建模:
- 趋势基于
ndate
of nyear
使用非循环样条,或
- 循环模式基于
nmonth
or doy
(一年中的某一天),或
- 趋势和周期模式的结合
从您的问题中不清楚您的数据是否仅限于一年。如果数据跨越多年,那么您不能只使用循环样条ndate
多变的。您将需要一个very复杂的标准样条线(选项 1)或包括两个样条线,一个用于年份之间部分,一个用于年内部分(选项 3)。
如果您的数据超过多年,那么我会将模型设置为
O3 ~ s(X, Y, bs = "tp", k = 10) + wd + s(doy, bs = 'cc', k = 20) +
s(ndate, bs = "tp", k = 50) + district
也许s(nyear, .... )
就足够了而不是s(ndate, .... )
.
这种时间分量的分解非常有用,因为与单个更复杂的平滑相比,通过两个简单的、经过良好估计的平滑通常可以更好地拟合序列。它还允许您测试年内和之间的影响。
如果您需要季节性周期随趋势变化,那么张量积会很有帮助:
O3 ~ s(X, Y, bs = "tp", k = 10) + wd +
te(doy, ndate, bs = c('cc','tp'), k = c(20,50)) + district
对于循环样条,您可能还需要设置knots
参数,特别是如果您的数据没有完全跨越一年中的全部天数等。doy
我会用knots = list(doy = c(0.5, 366.5))
因为这使得 12 月 31 日和 1 月 1 日的估计值略有不同。为了nmonth
这更重要,否则 12 月和 1 月将获得相同的拟合值。我用:knots = list(nmonth = c(0.5, 12.5))
.
这里的想法是1
and 12
反映相应月份的中旬,并且0.5
and 12.5
第一个月和最后一个月的开始和结束,我们可能期望是相同的。