## Hilfestellung für die Aufgabe 2 der Serie 3 im Block   Nichtparametrische Regression:

#######################################################
###################### Aufgabe 2 ######################
#######################################################

# Wir benötigen "gss" für die Daten:
if(!requireNamespace("gss")) install.packages("gss")
## Daten laden
data(ozone, package = "gss")

## Daten transformieren (und den Ausreisser weglassen (!)):
d.ozone <- subset(transform(ozone, logupo3 = log(upo3)), select = -upo3,
                  subset = wdsp < 15)

## Funktion für Cross-Validation:
## - Das erste Argument 'fitfn' ist eine R *Function*, für deren Result  predict() funktionieren muss.
## - '...' sind Argumente, die an  fitfn() übergeben werden.
##         Ersetzen Sie diese '...' *nicht* !
cv <- function(fitfn, data, y.col = 10, ...) {
  ssr <- 0
  n <- nrow(data)
  if(!is.numeric(n) || n <= 0)
    stop("'data' muss data.frame oder Matrix (mit mindestens einer Beobachtung) sein")
  for(j in 1:n) {
    ## Fortschritt anzeigen {simpel; es gibt Raffinierteres --> help(txtProgressBar) } :
    cat(if(j %% (n %/% 10) == 0) paste("\n", (100*j) %/% n, "%") else ".")
    ## Anpassen ("train") ohne 'j':
    train <- data[-j,]
    fit <- fitfn(x = train[,-y.col], y = train[,y.col], ...)
    ## 'j' vorhersagen ("test"):
    test <- data[j,]
    ssr <- ssr + (test[,y.col] - predict(fit, test[,-y.col]))^2
  }
  ssr
}

## Beispiel für einen Aufruf:
if(FALSE)
   cv.sn.2 <- cv(ppr, d.ozone, nterms = 2, max.terms = 5)
