10 votos

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

Mi pregunta trata de GAMs en el paquete mgcv R. Debido a un tamaño de muestra pequeño quiero determinar el error de predicción utilizando validación cruzada de dejar uno de salida. ¿Es esto razonable? ¿Hay un paquete o código de cómo puedo hacerlo? El errorest() en el paquete de IPREDy no funciona. Es un conjunto de datos de prueba simple:

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 mano!

5voto

Jeff Puntos 234

Me gusta mucho el paquete caret por cosas como esta, pero por desgracia acabo de leer que no se puede especificar el formula en gam exactamente.

"Cuando el uso de trenes con este modelo, no se puede (en este momento) especificar el gam fórmula. símbolo de intercalación tiene una función interna que da cuenta de una fórmula que se basa en cuántos niveles únicos, cada predictor tiene etc. En otras palabras, tren actualmente determina qué términos se suavizan y que son el viejo y simple lineal de efectos principales."

fuente: http://stackoverflow.com/questions/20044014/error-with-train-from-caret-package-using-method-gam

pero si dejas train seleccione el suave términos, en este caso se produce su modelo exactamente de todos modos. El valor predeterminado de las métricas de rendimiento en este caso es RMSE, pero se puede cambiar el uso de la summaryFunction argumento de la trainControl función.

Creo que uno de los principales inconvenientes de la LOOCV es que cuando el conjunto de datos es grande, se tarda una eternidad. Desde el 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

0voto

Steve Rattey Puntos 41

Usted puede echar un vistazo a la función CVgam del http://www.inside-r.org/packages/cran/gamclass/docs/CVgam

Espero que esto puede ayudar a

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X