# Gausovo jezgro
K_Gausovo = function(t) {
  exp(-t^2/2)/sqrt(2*pi)
}

# bikvadratno jezgro
K_bikvadratno = function(t) {
  if(abs(t) < 1) {
    return((15/16)*(1 - t^2)^2)
  }
  else {
    return(0)
  }
}

# trougaono jezgro
K_trougaono = function(t) {
  if(abs(t) < 1) {
    return(1 - abs(t))
  }
  else {
    return(0)
  }
}

# Epanehnikovo jezgro
K_Epanehnikovo = function(t) {
  if(abs(t) < sqrt(5)) {
    return((3/(4*sqrt(5)))*(1 - (1/5)*t^2))
  }
  else {
    return(0)
  }
}

# uniformno jezgro
K_uniformno = function(t) {
  if(abs(t) < 1) {
    return(1/2)
  }
  else {
    return(0)
  }
}

ocena_gustine_jezgrom = function(y, x, h, jezgro = "Gausovo") {
  f = rep(0, length(y))
  
  if (jezgro == "Gausovo") {
    for (j in 1:length(y)) {
      # racunamo ocenu gustine u svakoj tacki iz y
      f[j] = sum(sapply((y[j] - x)/h, K_Gausovo))
    }
  }
  else if (jezgro == "bikvadratno") {
    for (j in 1:length(y)) {
      f[j] = sum(sapply((y[j] - x)/h, K_bikvadratno))
    }
  }
  else if (jezgro == "trougaono") {
    for (j in 1:length(y)) {
      f[j] = sum(sapply((y[j] - x)/h, K_trougaono))
    }
  }
  else if (jezgro == "Epanehnikovo") {
    for (j in 1:length(y)) {
      f[j] = sum(sapply((y[j] - x)/h, K_Epanehnikovo))
    }
  }
  else if (jezgro == "uniformno") {
    for (j in 1:length(y)) {
      f[j] = sum(sapply((y[j] - x)/h, K_uniformno))
    }
  }
  return(f/(n*h))
}

n = 100
podaci = rnorm(n)

# parametar glatkosti 
h_G = 1.06*n^(-1/5)*sd(podaci)
h_bk = 2.786*n^(-1/5)*sd(podaci)
h_t = 1.89*n^(-1/5)*sd(podaci)
h_E = 1.05*n^(-1/5)*sd(podaci)
h_u = 1.84*n^(-1/5)*sd(podaci)

y = seq(-4, 4, 0.1)

plot(y, ocena_gustine_jezgrom(y, podaci, h_G, "Gausovo"), 
     type = "n", xlab = "", ylab = "", xlim = c(-4, 4),
     ylim = c(0, 0.6), main = "Ocena gustine jezgrom")
lines(y, ocena_gustine_jezgrom(y, podaci, h_G, "Gausovo"), type = "l")
lines(y, ocena_gustine_jezgrom(y, podaci, h_bk, "bikvadratno"), type = "l", col = 2)
lines(y, ocena_gustine_jezgrom(y, podaci, h_t, "trougaono"), type = "l", col = 3)
lines(y, ocena_gustine_jezgrom(y, podaci, h_E, "Epanehnikovo"), type = "l", col = 4)
lines(y, ocena_gustine_jezgrom(y, podaci, h_u, "uniformno"), type = "l", col = 5)
legend(1.2, 0.5, legend=c("Gausovo jezgro", "Bikvadratno jezgro", "Trougaono jezgro", "Epanehnikovo jezgro", "Uniformno jezgro"),  
       col = 1:5, lty = rep(1, 5), cex = 0.5, box.lty = 1)

