8 votos

Implementación de la Cruz validiation

Estoy asistiendo a un curso en estadística computacional, que debería ser un curso aplicado. Estudiar diferentes métodos, los cuales son importantes en la "realidad". Uno de estos temas es el de la Validación Cruzada. Estoy enfrentado con el siguiente problema que viene de una tarea. Se nos da un conjunto de datos y supongamos que el modelo es de la forma $$ Y_i=m(X_i)+\epsilon_i $$ es decir, un test no paramétrico de regresión. Queremos calcular el error generalizado el uso de la licencia de una Validación Cruzada de puntuación. Esto debe hacerse mediante el uso de kernel estimador ksmooth, local polinomios y splines de suavizado. Mi primera pregunta es muy general: la vista de los datos ¿cómo puedo elegir por el ojo de una razonable ancho de banda para el estimador de kernel? Véase, por ejemplo, la siguiente imagen:

enter image description here

Dado que estos datos se ve bastante "salvaje" es para mí no está claro cómo elegir un ancho de banda. Mi primer intento fue sólo para ejecutar ksmooth jugando con diferente ancho de banda. Pero como he dicho, aquí los datos es salvaje, por lo que es (para mí) es difícil determinar un ancho de banda razonable.

El segundo problema es más concreto sobre el problema descrito anteriormente. Hasta ahora tengo el siguiente código:

   cv <- function(data,used.function)
{
  n <- nrow(data)
  cv.value <- rep(0,length(n))
  for (i in 1:n){
      new.data <- data[-i,]
      cv.value[i] <- used.function(new.data[,1],new.data[,2],data[i,1])
  }
  ## MSE
  return(1/n*sum((new.data[,2]-cv.value)^2))
}


### kernel estimator usind nadaraya-watson:
fcn1 <- function(reg.x, reg.y, x){
  return(ksmooth(reg.x, reg.y, x.point = x, kernel = "normal", bandwidth = h)$y)
}
### CV-score for kernel estimator:
(cv.nw <- cv(real.data, fcn1))

la función cv debe ser generales, que puedo aplicar local polinomios y smoothing spline. La variable real.de datos contiene los datos. Es una $n\times 2$ matriz en la cual se almacenan todas las $x$ valores y $y$ valores. En el cuerpo de la función de cv realizar un dejar uno fuera de la validación cruzada. Sin embargo el uso de este código concede para el cv.nw NA. Lo que está mal con mi código? Estoy muy agradecido por su ayuda.

4voto

llg179 Puntos 1

Me doy cuenta de que esto es un poco mayor pregunta ahora, pero tal vez esto puede arrojar algo de luz. Hay varias cosas mal con su código.

  1. El código tal y como está NO es reproducible. En ningún momento se h define que es exactamente el parámetro que desea ajustar.
  2. No se itera sobre diferentes anchos de banda. Si usted está usando validación cruzada para comparar entre distintos modelos, necesita diferentes modelos (es decir, diferentes parámetros).

La modificación de su código y la utilización de la cars conjunto de datos, aquí es un reproducible ejemplo de Dejar-Uno-Fuera de validación Cruzada en el ancho de banda por el cual se pasa de una " red " de diferentes anchos de banda para ajustar el modelo.

cv <- function(data, used.function, bandwidth.grid)
{
  n <- nrow(data)
  mse <- matrix(, nrow=length(bandwidth.grid), ncol=2)
  for (b in 1:length(bandwidth.grid)){
    cv.value <- rep(0, n-1)
    for (i in 1:(n-1)){
      new.data <- data[-i,]
      funcargs <- list(reg.x=new.data[,1],reg.y=new.data[,2],x=data[i,1], h = bandwidth.grid[b])
      cv.value[i] <- do.call(used.function, funcargs)
    }
    mse[b,] <- c(bandwidth.grid[b], 1/n*sum((new.data[,2]-cv.value)^2))
  }

  ## MSE
  colnames(mse) <- c("bandwidth", "mse")
  return(mse)
}

### kernel estimator usind nadaraya-watson:
fcn1 <- function(reg.x, reg.y, x, h){
  return(ksmooth(reg.x, reg.y, x.point = x, kernel = "normal", bandwidth = h)$y)
}

attach(cars)
### CV-score for kernel estimator:
cv(cbind(speed, dist), fcn1, seq(10))
> cv(cbind(speed, dist), fcn1, seq(10))
      bandwidth      mse
 [1,]         1 261.9555
 [2,]         2 223.3542
 [3,]         3 217.8303
 [4,]         4 214.0923
 [5,]         5 211.1874
 [6,]         6 211.4104
 [7,]         7 214.6941
 [8,]         8 220.1501
 [9,]         9 227.2262
[10,]        10 235.5479

Aquí podemos ver que un bandwidth = 5 sería lo mejor.

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