isomle<-function (x) { if (is.complex(x)) { tem <- array(0, c(nrow(x), 2, ncol(x))) tem[, 1, ] <- Re(x) tem[, 2, ] <- Im(x) x <- tem } k <- dim(x)[1] m <- dim(x)[2] n <- dim(x)[3] if (m > 2) { print("Only valid for 2D data") } if (m == 2) { pm <- rep(0, times = 2 * k - 3) tem <- procrustes2d(x) tem1 <- bookstein.shpv(tem$mshape) sigm <- sum(diag(var(tem$tan)))/(n - 1)/2 pm[1:(k - 2)] <- tem1[3:k, 1] pm[(k - 1):(2 * k - 4)] <- tem1[3:k, 2] pm[2 * k - 3] <- 10 ans <- nlm(objfuniso, hessian = TRUE, pm, uu = x) out <- list(code = 0, mshape = 0, tau = 0, kappa = 0, varcov = 0, gradient = 0) mn <- matrix(0, k, 2) mn[1, 1] <- -0.5 mn[2, 1] <- 0.5 mn[3:k, 1] <- ans$estimate[1:(k - 2)] mn[3:k, 2] <- ans$estimate[(k - 1):(2 * k - 4)] out$mshape <- mn out$loglike <- -ans$minimum out$code <- ans$code out$gradient <- ans$gradient out$tau <- sqrt(1/ans$estimate[2 * k - 3]^2) out$kappa <- centroid.size(mn)^2/(4 * out$tau^2) out$varcov <- solve(ans$hessian) out$se <- c(sqrt(diag(out$varcov))) out$se[2*k-3] <- out$se[2*k-3] *out$tau**2 out } }