Ошибка в функции gam в именах (x) ‹- значение: атрибут 'names' должен быть той же длины, что и вектор

Я использую пакет 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) из фомуляра, и это может сработать. Кажется, что-то не так с полем даты.

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


person 王嘉炜    schedule 04.01.2019    source источник
comment
похоже, вам нужно будет преобразовать класс даты в числовой. (ps; я чаще всего видел циклический сплайн, используемый с месяцами/неделями и т. д., а не с необработанными датами)   -  person user20650    schedule 04.01.2019
comment
Данных ответов достаточно, но я добавлю, что у меня была такая же ошибка при использовании символьной переменной, которую я рассматривал как фактор, но формально не определял ее как таковую. Проблема была решена после преобразования mutate(var1 = as.factor(var.1))   -  person Kodiakflds    schedule 09.04.2021


Ответы (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. тренд на основе 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(ndate, .... ) будет достаточно s(nyear, .... ).

Этот вид декомпозиции временной составляющей полезен, так как вы часто можете лучше подобрать ряд с помощью двух простых, хорошо оцененных сглаживаний, чем одного более сложного сглаживания. Это также позволяет вам тестировать эффекты в течение и между годами.

Если вам нужно, чтобы сезонный цикл менялся в зависимости от тренда, вам пригодится тензорное произведение:

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 — начало и конец первого и последнего месяцев, которые, как мы можем ожидать, будут одинаковыми.

person Gavin Simpson    schedule 05.01.2019