Ошибка MGCV GAM (): модель имеет больше коэффициентов, чем данные

Я использую GAM (обобщенные аддитивные модели) для моего набора данных. Этот набор данных имеет 32 наблюдения, с 6 переменными предикторами и переменной отклика (а именно, мощность). я использую gam() функция mgcv пакет, чтобы соответствовать моделям. Всякий раз, когда я пытаюсь соответствовать модели, я получаю сообщение об ошибке как:

Error in gam(formula.hh, data = data, na.action = na.exclude,  : 
  Model has more coefficients than data

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

Я использую следующий код для этого,

library(mgcv)
formula.hh <- as.formula(power ~ s(temperature) 
                                + s(prevday1) + s(prevday2)
                                + s(prev_2_hour) + s(prev_instant1))
model <- gam(formula.hh, data = data, na.action = na.exclude)

Здесь я прилагаю данные с dput() функция

> dput(data)
data <- structure(list(power = c(250.615931666667, 252.675878333333, 
1578.209605, 186.636575166667, 1062.07912666667, 1031.481235, 
1584.38902166667, 276.973836666667, 401.620463333333, 1622.50827666667, 
273.825153333333, 1511.37474333333, 291.460865, 215.138178333333, 
247.509348333333, 1140.21383833333, 1680.63441666667, 1742.44168333333, 
592.162706166667, 1610.7307, 615.857495, 1664.13551, 464.973065, 
1956.2482, 1767.94469333333, 1869.02678333333, 1806.731, 1746.3731, 
549.216605, 1425.42390166667, 1900.32575, 1766.18103333333), 
    temperature = c(31, 30, 28, 28, 27, 31, 32, 32, 30.5, 33, 
    33, 30, 32, 24, 30, 26, 28, 32, 34, 25, 32, 33, 35, 36, 36, 
    37, 35, 33, 35, 33, 35, 32), prevday1 = c(NA, 250.615931666667, 
    252.675878333333, 1578.209605, 186.636575166667, 1062.07912666667, 
    1031.481235, 1584.38902166667, 276.973836666667, 401.620463333333, 
    1622.50827666667, 273.825153333333, 1511.37474333333, 291.460865, 
    215.138178333333, 247.509348333333, 1140.21383833333, 1680.63441666667, 
    1742.44168333333, 592.162706166667, 1610.7307, 615.857495, 
    1664.13551, 464.973065, 1956.2482, 1767.94469333333, 1869.02678333333, 
    1806.731, 1746.3731, 549.216605, 1425.42390166667, 1900.32575
    ), prevday2 = c(NA, NA, 250.615931666667, 252.675878333333, 
    1578.209605, 186.636575166667, 1062.07912666667, 1031.481235, 
    1584.38902166667, 276.973836666667, 401.620463333333, 1622.50827666667, 
    273.825153333333, 1511.37474333333, 291.460865, 215.138178333333, 
    247.509348333333, 1140.21383833333, 1680.63441666667, 1742.44168333333, 
    592.162706166667, 1610.7307, 615.857495, 1664.13551, 464.973065, 
    1956.2482, 1767.94469333333, 1869.02678333333, 1806.731, 
    1746.3731, 549.216605, 1425.42390166667), prev_instant1 = c(NA, 
    237.211388333333, 455.932271666667, 367.837349666667, 1230.40137333333, 
    1080.74080166667, 1898.06056666667, 326.103031666667, 302.770571666667, 
    1859.65283333333, 281.700161666667, 1684.32288333333, 291.448878333333, 
    214.838578333333, 254.042623333333, 1380.14074333333, 824.437228333333, 
    1660.46284666667, 268.004111666667, 1715.02763333333, 1853.08503333333, 
    1821.31845, 1173.91945333333, 1859.87353333333, 1887.67635, 
    1760.29563333333, 1876.05421666667, 1743.10665, 366.382048333333, 
    1185.16379, 1713.98534666667, 1746.36006666667), prev_instant2 = c(NA, 
    275.55167, 242.638122833333, 220.635857, 1784.77271666667, 
    1195.45020333333, 590.114391666667, 310.141536666667, 1397.3184605, 
    1747.44398333333, 260.10318, 1521.77355833333, 283.317726666667, 
    206.678135, 231.428693833333, 235.600631666667, 232.455201666667, 
    281.422625, 256.470893333333, 1613.82088333333, 1564.34841666667, 
    1795.03498333333, 1551.64725666667, 1517.69289833333, 1596.66556166667, 
    2767.82433333333, 2949.38005, 328.691775, 389.83789, 1805.71815333333, 
    1153.97645666667, 1752.75968333333), prev_2_hour = c(NA, 
    219.024983, 313.393630708333, 263.748829166667, 931.193606666667, 
    699.399163791667, 754.018962083334, 272.22309625, 595.954508875, 
    1597.21487208333, 512.64361, 1236.42579666667, 281.200373333334, 
    196.983981666666, 230.327737625, 525.483920416666, 391.120302791667, 
    610.101280416667, 247.710625543785, 978.741044166665, 979.658926666667, 
    1189.25306041667, 814.840889166667, 989.059700416665, 1352.2367025, 
    1770.20417833333, 1847.11590666667, 843.191556416666, 363.50806625, 
    904.924465041666, 841.746712500002, 1747.73452958333)), .Names = c("power", 
"temperature", "prevday1", "prevday2", "prev_instant1", "prev_instant2", 
"prev_2_hour"), class = "data.frame", row.names = c(NA, 32L))

1 ответ

Решение

Этот набор данных имеет 32 наблюдения.

На самом деле, только 30, как два ряда NA,

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

Да. По умолчанию s() выберите базовый размер (или ранг) равным 10 для 1D сглаживания, давая 10 необработанных параметров. После ограничения центрирования (см. ?identifiability) вы получаете на один параметр меньше, но у вас все еще есть 9 параметров для каждого сглаживания. Обратите внимание, что у вас есть 5 сглажей! Таким образом, у вас есть 45 параметров для гладких терминов, плюс перехват. Это больше, чем ваши 30 данных.

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

Нет. Эта ошибка обнаруживается, как только формула GAM была интерпретирована, а модель построена. Еще до реального строительства базы мы уже можем знать, что n (количество данных) и что p (количество параметров).

Есть ли способ справиться с этой ошибкой?

уменьшить k вручную, а не по умолчанию. Однако для кубического сплайна минимум k 3. Например, используйте s(temperature, bs = 'cr', k = 3), Обратите внимание, я также установил bs = 'cr' использовать естественный кубический сплайн, а не по умолчанию bs = 'tp' для сплайна регрессии тонких пластин. Вы можете использовать это, конечно, но для 1D гладкой "cr" это естественный выбор.

Другие вопросы по тегам