New.el2.test.wts <- function (wu, wv, mu0, nu0, indicmat) { sumwu <- sum(wu) sumwv <- sum(wv) indic4mu <- nu0 %*% t(indicmat) indic4nu <- mu0 %*% indicmat du <- 0.02 * sumwu/abs(sum(indic4mu)) dv <- 0.02 * sumwv/abs(sum(indic4nu)) dd <- min(du, dv) lamfun <- function(lam, wu, wv, sumwu, sumwv, indic4mu, indic4nu, indicmat) { mu <- wu/(sumwu + lam * indic4mu) nu <- wv/(sumwv + lam * indic4nu) return(mu %*% indicmat %*% t(nu)) } if ( abs(lamfun(0, wu, wv, sumwu, sumwv, indic4mu, indic4nu, indicmat)) < 1e-12) { lam <- 0 } else { if (lamfun(0, wu, wv, sumwu, sumwv, indic4mu, indic4nu, indicmat) > 0) { lo <- 0 up <- dd while (lamfun(up, wu, wv, sumwu, sumwv, indic4mu, indic4nu, indicmat) > 0) { up <- up + dd } } else { up <- 0 lo <- -dd while (lamfun(lo, wu, wv, sumwu, sumwv, indic4mu, indic4nu, indicmat) < 0) { lo <- lo - dd } } lam <- uniroot(lamfun, lower = lo, upper = up, tol = 1e-09, wu = wu, wv = wv, sumwu = sumwu, sumwv = sumwv, indic4mu = indic4mu, indic4nu = indic4nu, indicmat = indicmat)$root } mu1 <- wu/(sumwu + lam * indic4mu) #### nu0 %*% t(indicmat)) changed 3/2016 nu1 <- wv/(sumwv + lam * indic4nu) #### mu0 %*% indicmat) changed 3/2016 list(wu = wu, jumpu = mu1, wv = wv, jumpv = nu1, lam = lam) } #### deleted the input(and output): mean #### deleted the input(and output): u and v