我正在使用mgcv
软件包根据一些环境协变量对臭氧污染浓度进行建模。该模型采用以下形式:
model1 <- gam(O3 ~ s(X, Y, bs = "tp", k = 10) + wd + s(date, bs = "cc", k = 100) + district,
data = mydata, family = gaussian(link ="log"),
na.action = "na.omit", method = "REML")
这是协变量的结构:
> str(mydata)
'data.frame': 7100 obs. of 286 variables:
$ date : Date, format: "2016-01-01" "2016-01-01" "2016-01-01" ...
$ O3 : num 0.0141 0.0149 0.0102 0.0159 0.0186 ...
$ district : Factor w/ 10 levels "bc","bh","dl",..: 1 8 7 8 2 6 4 4 10 2 ...
$ wd : Factor w/ 16 levels "E","ENE","ESE",..: 13 13 13 13 13 2 9 9 11 13 ...
$ X : num 0.389 0.365 1 0.44 0.892 ...
$ Y : num 0.311 0.204 0.426 0.223 0.162 ...
我被困在
R中的错误:“名称”属性[1]的长度必须与向量[0]相同。
我尝试通过从末尾删除s(date, bs = "cc", k = 100)
一词来查找问题所在,并且可以很好地工作。日期字段似乎有问题。
我不确定如何解决此问题。任何建议将是极大的 感谢!
答案 0 :(得分:2)
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
的{{1}}且带有非循环样条的趋势,或者nyear
或nmonth
(一年中的某天)的循环模式,或目前尚不清楚您的数据是否仅限于一年。如果数据跨度多年,则不能仅使用doy
变量上的循环样条。您将需要非常复杂的标准样条线(选项1),或者包括两条样条线,一条用于年间部分,一条用于年内部分(选项3)。
如果您的数据是多年数据,那么我将模型设置为
ndate
或者也许用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
,我将使用{{1 }},因为这样可以使12月31日和1月1日的估算值略有不同。对于doy
来说,这一点更为重要,因为12月和1月将获得相同的拟合值。我使用:knots = list(doy = c(0.5, 366.5))
。
这里的想法是nmonth
和knots = list(nmonth = c(0.5, 12.5))
反映了相应月份的中间,而1
和12
则反映了第一个月和最后一个月的开始和结束。我们可能希望一样。