#84. odredjivanje optimalnog h metodom unakrsne provere funkcije verodostojnosti sa Gausovim jezgrom
X<-read.table("C:/Users/Marija/Desktop/OPMS/SDSS1.txt")
x<-X[,2]
n<-length(x)
h<-0.9*min(IQR(x)/1.34,sd(x))*n^(-1/5)
Kn<-function(t){
  return(exp(-t^2/2)/sqrt(2*pi))
}
H<-seq(0.25*h,1.5*h,(1.5*h-0.25*h)/100)
fh<-matrix(0,length(H),n)
#ocene se odredjuju u svakoj tacki x_i
for (j in 1:n){
  for (i in 1:n){
    if(i!=j){
      z<-(x[j]-x[i])/H
      f<-Kn(z) #jezgro u tacki
      fh[,j]<-fh[,j]+f/(n*H) #ukupna gustina
    }
  }
}
#funkcija koja se maksimizuje: CV(h)=sum(log(f_{-i}(X_i)))/n
suma<-rep(0,length(H))
for(i in 1:length(H)){
  suma[i]<-sum(log(fh[i,]))/n
}
plot(H, suma, type = "l")
H[which.max(suma)]

#ako se maksimum funkcije CV (suma) nalazi na jednoj od granica onda se siri interval na tu stranu 
#dok se ne dobije lokalni minimum
H<-seq(0.05*h,1.5*h,(1.5*h-0.05*h)/100)
fh<-matrix(0,length(H),n)
for (j in 1:n){
  for (i in 1:n){
    if(i!=j){
      z<-(x[j]-x[i])/H
      f<-Kn(z) #jezgro u tacki
      fh[,j]<-fh[,j]+f/(n*H) #ukupna gustina
    }
  }
}
suma<-rep(0,length(H))
for(i in 1:length(H)){
  suma[i]<-sum(log(fh[i,]))/n
}
plot(H, suma, type = "l")
H[which.max(suma)]