GAM-Kreuzvalidierung zum Testen des Vorhersagefehlers

10

Meine Fragen beziehen sich auf GAMs im mgcv R-Paket. Aufgrund einer kleinen Stichprobengröße möchte ich den Vorhersagefehler mithilfe einer einmaligen Kreuzvalidierung ermitteln. Ist das vernünftig? Gibt es ein Paket oder einen Code, wie ich das machen kann? Die errorest()Funktion im ipred- Paket funktioniert nicht. Ein einfacher Testdatensatz ist:

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

Vielen Dank für Ihre helfende Hand!

Peter
quelle
Sie können einen Blick auf die CVgam-Funktion in-r.org/packages/cran/gamclass/docs/CVgam werfen. Ich hoffe, dies kann helfen
user051514

Antworten:

3

Ich mag das Paket caretfür Dinge wie diese aber leider Ich habe gerade gelesen , dass Sie nicht die angeben können , formulain gamgenau dafür.

"Wenn Sie Zug mit diesem Modell verwenden, können Sie (zu diesem Zeitpunkt) die Spielformel nicht angeben. Caret verfügt über eine interne Funktion, die eine Formel basierend auf der Anzahl der eindeutigen Ebenen jedes Prädiktors usw. ermittelt. Mit anderen Worten, Zug bestimmt derzeit, welche Begriffe werden geglättet und sind einfache alte lineare Haupteffekte. "

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

Wenn Sie jedoch traindie glatten Begriffe auswählen lassen , wird in diesem Fall Ihr Modell trotzdem genau erstellt. Die Standardleistungsmetrik ist in diesem Fall RMSE. Sie können sie jedoch mithilfe des summaryFunctionArguments der trainControlFunktion ändern .

Ich denke, einer der Hauptnachteile von LOOCV ist, dass es ewig dauert, wenn der Datensatz groß ist. Da Ihr Datensatz klein ist und recht schnell funktioniert, halte ich ihn für eine sinnvolle Option.

Hoffe das hilft.

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)

Ausgabe:

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

In der mgcv-Bibliothek pdf heißt es;

"Bei einer durch eine Gam-Modellformel spezifizierten Modellstruktur versucht gam (), die geeignete Glätte für jeden anwendbaren Modellterm unter Verwendung von Vorhersagefehlerkriterien oder wahrscheinlichkeitsbasierten Methoden zu finden. Die verwendeten Vorhersagefehlerkriterien sind Generalized (Approximate) Cross Validation (GCV oder GACV), wenn der Skalenparameter unbekannt ist, oder ein Un-Bias Risk Estimator (UBRE), wenn er bekannt ist. "

"gam in mgcv löst das Problem der Schätzung der Glättungsparameter unter Verwendung des GCV-Kriteriums (Generalized Cross Validation): nD / (n - DoF) 2

oder

ein UBRE-Kriterium (Un-Bias Risk Estimator): D / n + 2sDoF / n - s "

Brad
quelle