Thanx Dimitris, Patrick and Berwin!

For other people interested in this problem, here are two valid solutions that work.

1) Re-parameterize  e.g.,

   EM <- c(100,0,0,0,100,0,0,0,100)
   W <- array(EM, c(3,3))
   d <- c(10, 20, 70)

   fn <- function(x){
         x <- exp(x) / sum(exp(x))
         r <- W%*%x - d
       crossprod(r, r)[1,1]
   }
   opt <- optim(rnorm(3), fn)
   res <- exp(opt$par) / sum(exp(opt$par))
   res

   "The first line of the `fn()' function is just a re-pameterization
   of your problem, i.e., if `y' is a vector of real numbers, then it
   is straightforward to see that `x = exp(y) / sum(exp(y))' will be
   real numbers in (0, 1) for which `sum(y)=1'. So instead of finding
   xs that minimize your function under the constraint (which is more
   difficult) you just find the ys using the above transformation." (I
   owe you a drink Dimitris !!!)

2)  Or minimize it as a quadratic function under a linear constraint:

   EM <- c(100,0,0,0,100,0,0,0,100)
   W <- array(EM, c(3,3))
   d <- c(10, 20, 70)
   library(quadprog)
   Dmat <- crossprod(W,W)
   dvec <- crossprod(d,W)
   A <-matrix(c(1,1,1),ncol=1)
   bvec <- 1
   solve.QP(Dmat, dvec, A, bvec, meq=1)

   This is based on the objective function (i.e. the thing you want to
   minimise) : min x'C'Cx - 2 d'Cx + d'd where sum(x) = 1
   (Thanx Berwin!!)

Kind regards,
Stef

______________________________________________
R-help@stat.math.ethz.ch mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html

Reply via email to