Ошибка в gam-функции в names (x) <- value: атрибут 'names' должен иметь ту же длину, что и вектор - PullRequest
0 голосов
/ 04 января 2019

Я использую пакет 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:Атрибут 'names' [1] должен иметь ту же длину, что и вектор [0].

Я пытаюсь выяснить, в чем проблема, удалив член s(date, bs = "cc", k = 100) из формул, и это можетхорошо работать.Похоже, что с полем даты что-то не так.

Я не совсем уверен, как решить эту проблему.Любой совет будет принята с благодарностью!

1 Ответ

0 голосов
/ 05 января 2019

Переменная 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 из nyearс нециклическим сплайном, или
  2. циклическим шаблоном на основе nmonth или doy (для дня года), или
  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)), поскольку это позволяет 31 декабря и 1 января иметьнемного отличающиеся оценочные значения.Для nmonth это более важно, так как в противном случае декабрь и январь получат одинаковое установленное значение.Я использую: knots = list(nmonth = c(0.5, 12.5)).

Идея заключается в том, что 1 и 12 отражают середину соответствующего месяца, а 0.5 и 12.5 - начало и конец первого и последнего месяцев., что мы могли бы ожидать, что то же самое.

...