mgcv gam() error: model has more coefficients than data
mgcv gam() error: model has more coefficients than data
我正在为我的数据集使用 GAM
(广义加法模型)。该数据集有 32 个观测值,具有 6 个预测变量和一个响应变量(即功效)。
我正在使用 mgcv
包的 gam()
函数来拟合模型。每当我尝试拟合模型时,我都会收到一条错误消息:
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))
This dataset has 32 observations.
实际上,只有 30 个,因为两行有 NA
。
From this error message, I infer that I have more predictor variables as compared to the number of observations.
是的。默认情况下,s()
选择基础维度(或等级)为 10 以实现 1D 平滑器,给出 10 个原始参数。居中约束后(参见 ?identifiability
)你得到的参数少了一个,但每个平滑仍然有 9 个参数。请注意,您有 5 个平滑!所以你有 45 个平滑项参数,外加一个截距。这比你的 30 条数据要大。
I guess this error is generated during cross-validation procedures.
没有。一旦解释了 GAM 公式并构建了模型框架,就会检测到此错误。甚至在构建真正的基础之前,我们就已经可以知道什么是 n
(数据数量)和什么是 p
(参数数量)。
Is there any way to handle this error?
手动减少 k
而不是使用默认值。但是,对于三次样条,最小 k
为 3。例如,使用 s(temperature, bs = 'cr', k = 3)
。请注意,我还设置了 bs = 'cr'
以使用自然三次样条,而不是默认的 bs = 'tp'
用于薄板回归样条。你当然可以使用它,但是对于一维平滑 "cr"
是一个自然的选择。
我正在为我的数据集使用 GAM
(广义加法模型)。该数据集有 32 个观测值,具有 6 个预测变量和一个响应变量(即功效)。
我正在使用 mgcv
包的 gam()
函数来拟合模型。每当我尝试拟合模型时,我都会收到一条错误消息:
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))
This dataset has 32 observations.
实际上,只有 30 个,因为两行有 NA
。
From this error message, I infer that I have more predictor variables as compared to the number of observations.
是的。默认情况下,s()
选择基础维度(或等级)为 10 以实现 1D 平滑器,给出 10 个原始参数。居中约束后(参见 ?identifiability
)你得到的参数少了一个,但每个平滑仍然有 9 个参数。请注意,您有 5 个平滑!所以你有 45 个平滑项参数,外加一个截距。这比你的 30 条数据要大。
I guess this error is generated during cross-validation procedures.
没有。一旦解释了 GAM 公式并构建了模型框架,就会检测到此错误。甚至在构建真正的基础之前,我们就已经可以知道什么是 n
(数据数量)和什么是 p
(参数数量)。
Is there any way to handle this error?
手动减少 k
而不是使用默认值。但是,对于三次样条,最小 k
为 3。例如,使用 s(temperature, bs = 'cr', k = 3)
。请注意,我还设置了 bs = 'cr'
以使用自然三次样条,而不是默认的 bs = 'tp'
用于薄板回归样条。你当然可以使用它,但是对于一维平滑 "cr"
是一个自然的选择。