Validación cruzada de GAM para probar el error de predicción

10

Mis preguntas tratan sobre los GAM en el paquete mgcv R. Debido a un tamaño de muestra pequeño, quiero determinar el error de predicción utilizando la validación cruzada de dejar uno fuera. ¿Es esto razonable? ¿Hay un paquete o código de cómo puedo hacer esto? La errorest()función en el paquete ipred no funciona. Un conjunto de datos de prueba simple es:

library(mgcv)
set.seed(0)
dat <- gamSim(1,n=400,dist="normal",scale=2)
b<-gam(y~s(x0)+s(x1)+s(x2)+s(x3),data=dat)
summary(b)
pred <- predict(b, type="response")

¡Muchas gracias por tu ayuda!

Peter
fuente
Puede echar un vistazo a la función CVgam inside-r.org/packages/cran/gamclass/docs/CVgam Espero que esto pueda ayudar
user051514

Respuestas:

3

Me gusta mucho el paquete caretpara este tipo de cosas, pero por desgracia acabo de leer que no se puede especificar el formulaen gamexactamente para ello.

"Cuando usas train con este modelo, no puedes (en este momento) especificar la fórmula gam. Caret tiene una función interna que calcula una fórmula basada en cuántos niveles únicos tiene cada predictor, etc. En otras palabras, train actualmente determina qué los términos se suavizan y son simples efectos principales lineales antiguos ".

fuente: /programming/20044014/error-with-train-from-caret-package-using-method-gam

pero si permite trainseleccionar los términos suaves, en este caso produce su modelo exactamente de todos modos. La métrica de rendimiento predeterminada en este caso es RMSE, pero puede cambiarla utilizando el summaryFunctionargumento de la trainControlfunción.

Creo que uno de los principales inconvenientes de LOOCV es que cuando el conjunto de datos es grande, lleva una eternidad. Como su conjunto de datos es pequeño y funciona bastante rápido, creo que es una opción sensata.

Espero que esto ayude.

library(mgcv)
library(caret)

set.seed(0)

dat <- gamSim(1, n = 400, dist = "normal", scale = 2)

b <- train(y ~ x0 + x1 + x2 + x3, 
        data = dat,
        method = "gam",
        trControl = trainControl(method = "LOOCV", number = 1, repeats = 1),
        tuneGrid = data.frame(method = "GCV.Cp", select = FALSE)
)

print(b)
summary(b$finalModel)

salida:

> print(b)
Generalized Additive Model using Splines 

400 samples
  9 predictors

No pre-processing
Resampling: 

Summary of sample sizes: 399, 399, 399, 399, 399, 399, ... 

Resampling results

  RMSE      Rsquared 
  2.157964  0.7091647

Tuning parameter 'select' was held constant at a value of FALSE

Tuning parameter 'method' was held constant at a value of GCV.Cp

> summary(b$finalModel)

Family: gaussian 
Link function: identity 

Formula:
.outcome ~ s(x0) + s(x1) + s(x2) + s(x3)

Parametric coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)   7.9150     0.1049   75.44   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

Approximate significance of smooth terms:
        edf Ref.df       F  p-value    
s(x0) 5.173  6.287   4.564 0.000139 ***
s(x1) 2.357  2.927 103.089  < 2e-16 ***
s(x2) 8.517  8.931  84.308  < 2e-16 ***
s(x3) 1.000  1.000   0.441 0.506929    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

R-sq.(adj) =  0.726   Deviance explained = 73.7%
GCV =  4.611  Scale est. = 4.4029    n = 400
Jeff
fuente
0

En el pdf de la biblioteca mgcv dice;

"Dada una estructura de modelo especificada por una fórmula de modelo de gam, gam () intenta encontrar la suavidad apropiada para cada término de modelo aplicable utilizando criterios de error de predicción o métodos basados ​​en la probabilidad. Los criterios de error de predicción utilizados son Validación cruzada generalizada (aproximada) (GCV o GACV) cuando el parámetro de escala es desconocido o un Estimador de riesgo no sesgado (UBRE) cuando se conoce ".

"gam en mgcv resuelve el problema de estimación de parámetros de suavizado utilizando el criterio de Validación Cruzada Generalizada (GCV): nD / (n - DoF) 2

o

un criterio de estimador de riesgo no sesgado (UBRE): D / n + 2sDoF / n - s "

Puntilla
fuente