名称(x)<-值中的gam函数出错:'名称'属性的长度必须与向量的长度相同

时间:2019-01-04 05:19:33

标签: r date gam

我正在使用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)一词来查找问题所在,并且可以很好地工作。日期字段似乎有问题。

我不确定如何解决此问题。任何建议将是极大的 感谢!

1 个答案:

答案 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')))

然后,我可以选择通过多种方式对时间分量进行建模:

  1. 基于ndate的{​​{1}}且带有非循环样条的趋势,或者
  2. 基于nyearnmonth(一年中的某天)的循环模式,或
  3. 趋势和循环模式的组合

目前尚不清楚您的数据是否仅限于一年。如果数据跨度多年,则不能仅使用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))

这里的想法是nmonthknots = list(nmonth = c(0.5, 12.5))反映了相应月份的中间,而112则反映了第一个月和最后一个月的开始和结束。我们可能希望一样。

相关问题