Validação cruzada do GAM para testar erro de previsão

10

Minhas perguntas tratam de GAMs no pacote mgcv R. Devido a um pequeno tamanho de amostra, desejo determinar o erro de previsão usando a validação cruzada de exclusão única. Isso é razoável? Existe um pacote ou código como eu posso fazer isso? A errorest()função no pacote ipred não funciona. Um conjunto de dados de teste simples é:

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")

Muito obrigado pela sua ajuda!

Peter
fonte
Você pode ter um olhar para a função CVgam inside-r.org/packages/cran/gamclass/docs/CVgam Espero que isso pode ajudar
user051514

Respostas:

3

Eu realmente gosto do pacote caretpara coisas como esta, mas infelizmente eu só li que você não pode especificar o formulaem gamexatamente por isso.

"Quando você usa o train com este modelo, não é possível (no momento) especificar a fórmula gam. Caret possui uma função interna que descobre uma fórmula com base em quantos níveis únicos cada preditor possui etc. Em outras palavras, o train atualmente determina quais os termos são suavizados e são simples efeitos principais lineares antigos ".

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

mas se você trainselecionar os termos suaves, nesse caso, ele produzirá seu modelo exatamente de qualquer maneira. A métrica de desempenho padrão nesse caso é RMSE, mas você pode alterá-la usando o summaryFunctionargumento da trainControlfunção.

Eu acho que uma das principais desvantagens do LOOCV é que, quando o conjunto de dados é grande, leva uma eternidade. Como seu conjunto de dados é pequeno e funciona muito rápido, acho que é uma opção sensata.

Espero que isto ajude.

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)

resultado:

> 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
fonte
0

No pdf da biblioteca mgcv está escrito;

"Dada uma estrutura de modelo especificada por uma fórmula de modelo gam, gam () tenta encontrar a suavidade apropriada para cada termo de modelo aplicável usando critérios de erro de previsão ou métodos baseados em probabilidade. Os critérios de erro de previsão usados ​​são Validação Cruzada Generalizada (Aproximada) (GCV ou GACV) quando o parâmetro de escala for desconhecido ou um estimador de risco imparcial (UBRE) quando for conhecido. "

"gam em mgcv resolve o problema de estimativa de parâmetros de suavização usando o critério Generalized Cross Validation (GCV): nD / (n - DoF) 2

ou

um critério do Estimador de risco não tendencioso (UBRE): D / n + 2sDoF / n - s "

Brad
fonte