#' Klein-Spady semiparametric binary response estimator #'

#' Kernel-based semiparametric log likelihood evaluation for the binary response #' model as proposed by Klein and Spady (1993). #'

#' @param b parameter vector #' @param X design matrix #' @param y binary response vector #' @param h kernel bandwidth #' @param k kernel index: 1 for Epanechnikov, 2 for Gaussian, and #' 3 for the 4th order kernel used by Horowitz (1993). #' @param eps trimming tolerance parameter #' @return A list with components: #' item logLik the log likelihood value #' item F trimmed probability estimates #' item sindex single index linear predictor #' @references #' Klein, R.W. and R.H. Spady (1993) An Efficient Semiparametric #' Estimator for Binary Response Models, Econometrica, 61, 387–421, #' @export KleinSpady <- function(b, X, y, h = NULL, k = 1, eps = 1e-20){

Xb <- X %*% b
n <- length(y)
Pn <- mean(y)
K <- function(u) {
    switch(k,
        15/16 * (1-u^2)^2 * (1*(abs(u) <= 1)),
        dnorm(u),
        (21/64) * (1- 5*(u/5)^2 + 7*(u/5)^4 - 3*(u/5)^6) * (1*(abs(u)<=5)))
    }
F <- rep(NA, n)
for (i in 1:n){
        Kz <- K((Xb - Xb[i])/h)
        F[i] <- crossprod(Kz, y/sum(Kz))
        }       
F[F <= eps] <- eps
nF <- 1 - F
nF[nF <= eps] <- eps
logLik <- sum(y * log(F) + (1-y) * log(nF))
list(logLik = logLik, F = F, sindex = Xb)
}