[R] Simple question on a function

2006-10-02 Thread Serguei Kaniovski
I would like to apply the following function to the rows of the matrix 
mat, so that freq[1],...,freq[4] are the four elements of each row.

min_chi2-function(freq){

obj-function(x){
(freq[1]-(1-x[1])*(1-x[2])-x[3]*sqrt(x[1]*(1-x[1])*x[2]*(1-x[2])))^2/freq[1]+
(freq[2]-(1-x[1])*x[2]+x[3]*sqrt(x[1]*(1-x[1])*x[2]*(1-x[2])))^2/freq[2]+
(freq[3]-x[1]*(1-x[2])+x[3]*sqrt(x[1]*(1-x[1])*x[2]*(1-x[2])))^2/freq[3]+
(freq[4]-x[1]*x[2]-x[3]*sqrt(x[1]*(1-x[1])*x[2]*(1-x[2])))^2/freq[4]
}

optim(c(0.1,0.1,0.1),obj,NULL,method=BFGS)$par
}

mat-matrix(c(0.4,0.1,0.1,0.4), byrow=TRUE, nrow=10, ncol=4)

Questions:
1. How to do this using the apply function?
2. Can opmit be used directly, i.e. without needing to define the 
function min_chi2?
3. How to pass the vector of initial conditions (c(0.1,0.1,0.1)) as an 
argument to apply?

The output should be a 10x3 matrix containing 0.5 0.5 0.6 in each row.

Thanks a lot,
Serguei
-- 
___

Austrian Institute of Economic Research (WIFO)

Name: Serguei Kaniovski P.O.Box 91
Tel.: +43-1-7982601-231 Arsenal Objekt 20
Fax:  +43-1-7989386 1103 Vienna, Austria
Mail: [EMAIL PROTECTED]

http://www.wifo.ac.at/Serguei.Kaniovski

__
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
and provide commented, minimal, self-contained, reproducible code.


Re: [R] Simple question on a function

2006-10-02 Thread Christoph Buser
Dear Serguei

There might be more efficient ways, but this should work:   

## Define function that you want to optimize. In your case I
## copied your code, but included freq as a second argument:
fun - function(x, freq)
{
  (freq[1]-(1-x[1])*(1-x[2])-x[3]*sqrt(x[1]*(1-x[1])*x[2]*(1-x[2])))^2/freq[1]+
(freq[2]-(1-x[1])*x[2]+x[3]*sqrt(x[1]*(1-x[1])*x[2]*(1-x[2])))^2/freq[2]+
  (freq[3]-x[1]*(1-x[2])+x[3]*sqrt(x[1]*(1-x[1])*x[2]*(1-x[2])))^2/freq[3]+
(freq[4]-x[1]*x[2]-x[3]*sqrt(x[1]*(1-x[1])*x[2]*(1-x[2])))^2/freq[4]
}

## Define mat with values for freq (your code)
mat-matrix(c(0.4,0.1,0.1,0.4), byrow=TRUE, nrow=10, ncol=4)

## Use apply on mat
apply(mat, 1, function(freq, start) optim(start, fun,
method=BFGS, freq = freq)$par, start = c(0.1,0.1,0.1))

You still can use t() to transpose the matrix if you want the
solutions by row instead of columns.


Please remark that in general optim returns a list, including
several arguments, e.g. convergence that indicates if optim has
converge.
Since you wanted a matrix I only returned optim(...)$par. This
might be dangerous since the additional information gets
lost. Maybe it is better to save the output in a list. You can
try:  

apply(mat, 1, function(freq, start) optim(start, fun,
method=BFGS, freq = freq), start = c(0.1,0.1,0.1))

to see the difference.

Hope this helps

Christoph

--

Credit and Surety PML study: visit our web page www.cs-pml.org

--
Christoph Buser [EMAIL PROTECTED]
Seminar fuer Statistik, LEO C13
ETH Zurich  8092 Zurich  SWITZERLAND
phone: x-41-44-632-4673 fax: 632-1228
http://stat.ethz.ch/~buser/
--


Serguei Kaniovski writes:
  I would like to apply the following function to the rows of the matrix 
  mat, so that freq[1],...,freq[4] are the four elements of each row.
  
  min_chi2-function(freq){
  
  obj-function(x){
  (freq[1]-(1-x[1])*(1-x[2])-x[3]*sqrt(x[1]*(1-x[1])*x[2]*(1-x[2])))^2/freq[1]+
  (freq[2]-(1-x[1])*x[2]+x[3]*sqrt(x[1]*(1-x[1])*x[2]*(1-x[2])))^2/freq[2]+
  (freq[3]-x[1]*(1-x[2])+x[3]*sqrt(x[1]*(1-x[1])*x[2]*(1-x[2])))^2/freq[3]+
  (freq[4]-x[1]*x[2]-x[3]*sqrt(x[1]*(1-x[1])*x[2]*(1-x[2])))^2/freq[4]
  }
  
  optim(c(0.1,0.1,0.1),obj,NULL,method=BFGS)$par
  }
  
  mat-matrix(c(0.4,0.1,0.1,0.4), byrow=TRUE, nrow=10, ncol=4)
  
  Questions:
  1. How to do this using the apply function?
  2. Can opmit be used directly, i.e. without needing to define the 
  function min_chi2?
  3. How to pass the vector of initial conditions (c(0.1,0.1,0.1)) as an 
  argument to apply?
  
  The output should be a 10x3 matrix containing 0.5 0.5 0.6 in each row.
  
  Thanks a lot,
  Serguei
  -- 
  ___
  
  Austrian Institute of Economic Research (WIFO)
  
  Name: Serguei Kaniovski  P.O.Box 91
  Tel.: +43-1-7982601-231  Arsenal Objekt 20
  Fax:  +43-1-7989386  1103 Vienna, Austria
  Mail: [EMAIL PROTECTED]
  
  http://www.wifo.ac.at/Serguei.Kaniovski
  
  __
  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
  and provide commented, minimal, self-contained, reproducible code.

__
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
and provide commented, minimal, self-contained, reproducible code.