"mesthub"<- function(x, delta = 0.1) { # Huber's M-estimator for covariance # x is the data matrix, delta a tuning parameter, which is usually = 0.1. # To check for convergence the Fisher-transform of the correlation coefficient # is used np <- dim(x) n <- np[1] p <- np[2] k <- sqrt(qchisq(1 - delta, p)) const <- pchisq(k^2, p + 2) + ((k^2 * delta)/p) covstar <- var(x) locstar <- apply(x, 2, mean) fishstar <- 10^2 step <- 1 fish <- 10^2 while((step <= 100) && (fish > 10^(-5))) { covm <- covstar loc <- locstar fishtran <- fishstar rd <- sqrt(mahalanobis(x, center = loc, cov = covm)) w1 <- (rd <= k) + (k * (rd > k))/rd w2 <- w1^2/const locstar <- apply(w1 * x, 2, sum)/sum(w1) y <- sqrt(w2) * scale(x, center = locstar, scale = F) covstar <- ((n - 1) * var(y))/n D <- diag((diag(covstar))^(-1/2)) corr <- D %*% covstar %*% D corrfish <- corr[lower.tri(corr)] corrfish <- (1 + corrfish)/(1 - corrfish) fishstar <- log(corrfish)/2 fish <- mean(abs(fishtran - fishstar)) step <- step + 1 } if(step > 100) { print("Convergence failed!") } list(loc = locstar, cov = covstar, step = step) }