【问题标题】:Error in gam function in names(x) <- value: 'names' attribute must be the same length as the vector名称(x)中的 gam 函数错误 <- 值:“名称”属性必须与向量的长度相同
【发布时间】:2019-01-04 05:19:32
【问题描述】:

我正在使用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) 一词来找出问题所在,它可以正常工作。日期字段似乎有问题。

我不确定如何解决这个问题。任何建议都会非常有用 赞赏!

【问题讨论】:

  • 看起来您需要将日期类转换为数字。 (ps;我经常看到循环样条与月/周等一起使用,而不是原始日期)
  • 给出的答案已经足够了,但我要补充一点,当我使用一个我认为是一个因素但没有正式定义它的字符变量时,我遇到了同样的错误。改造后问题解决了“mutate(var1 = as.factor(var.1))”

标签: r date gam


【解决方案1】:

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. 趋势基于 ndatenyear 与非循环样条,或
  2. 基于nmonthdoy(一年中的某天)的循环模式,或
  3. 趋势和循环模式的结合

从您的问题中不清楚您的数据是否仅限于一年。如果数据跨越多年,那么您不能只在 ndate 变量上使用循环样条。您将需要一个 非常 复杂的标准样条(选项 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)),因为这允许 Dec 31 日和 1 月 1 日的估计值略有不同。对于nmonth,这更为重要,否则 Dec 和 Jan 将获得相同的拟合值。我使用:knots = list(nmonth = c(0.5, 12.5))

这里的想法是112 反映了各自的月中,0.512.5 反映了第一个月和最后一个月的开始和结束,我们可能期望它们是相同的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-28
    • 2018-03-18
    • 2021-10-06
    • 1970-01-01
    • 2018-01-20
    • 2013-09-22
    • 1970-01-01
    相关资源
    最近更新 更多