apply

classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

apply

Guenther, Cameron
Hello,
I have a dataset d which is
 >d
         pop     catch
1   66462.01 10807.757
2   87486.73 46257.885
3   57211.64  9345.058
4   71321.62  4892.868
5  100024.89 27334.248
6  104504.91 48535.092
7   95295.51 39348.195
8   93737.35 34343.489
9   89375.05 28750.743
10  95312.65 30755.064
11 100888.17 55404.370
12  84790.23 37751.074
13  81129.82 29277.443
14  69797.09 21500.398
15  61690.34 18199.664
16  60671.08 19349.051
17  62852.57 16300.982
18  90646.32 34793.148

And a function opt1:

opt1 <- function (x) {
  Z <- x + M
  c.hat <- (x/Z)*pop*(1-exp(-Z))
  y <- (catch - c.hat)^2
  return(y)
  }

And define M = 0.25
For each row I want to return a value F that is a minimization of the
opt1 function

I have tried many variations of:
d$F<-apply(d,2,optim(0.3,opt1,method="BFGS")
and even:
For (I in 1:length(pop))apply(d,2,optim(0.3,opt1,method="BFGS"))

Every time I get the same error message

Error in optim(0.3, opt1, method = "BFGS") :
        objective function in optim evaluates to length 18 not 1

So the apply function is returning 18 values of F which I want but the
function only wants to return 1 value.

Any Suggestions.
Thanks,
Cam

______________________________________________
[hidden email] 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 | Threaded
Open this post in threaded view
|

Re: apply

Bert Gunter
You are not calling apply() properly. Please read relevant reference
material carefully. You might also wish to pick up one of the several good
books on R (check CRAN website) -- I like V&R's S PROGRAMMING.

I did not go through your example in detail, but your apply() call should be
of the form

apply(d,2,function(x)optim(x,...))

You may or may not get into scoping problems with the opt1 argument and have
to pass it in explicitly -- I can't remember how things work with optim.

-- Bert Gunter
Genentech Non-Clinical Statistics
South San Francisco, CA
 
"The business of the statistician is to catalyze the scientific learning
process."  - George E. P. Box
 
 

> -----Original Message-----
> From: [hidden email]
> [mailto:[hidden email]] On Behalf Of
> Guenther, Cameron
> Sent: Friday, January 13, 2006 11:03 AM
> To: [hidden email]
> Subject: [R] apply
>
> Hello,
> I have a dataset d which is
>  >d
>          pop     catch
> 1   66462.01 10807.757
> 2   87486.73 46257.885
> 3   57211.64  9345.058
> 4   71321.62  4892.868
> 5  100024.89 27334.248
> 6  104504.91 48535.092
> 7   95295.51 39348.195
> 8   93737.35 34343.489
> 9   89375.05 28750.743
> 10  95312.65 30755.064
> 11 100888.17 55404.370
> 12  84790.23 37751.074
> 13  81129.82 29277.443
> 14  69797.09 21500.398
> 15  61690.34 18199.664
> 16  60671.08 19349.051
> 17  62852.57 16300.982
> 18  90646.32 34793.148
>
> And a function opt1:
>
> opt1 <- function (x) {
>   Z <- x + M
>   c.hat <- (x/Z)*pop*(1-exp(-Z))
>   y <- (catch - c.hat)^2
>   return(y)
>   }
>
> And define M = 0.25
> For each row I want to return a value F that is a minimization of the
> opt1 function
>
> I have tried many variations of:
> d$F<-apply(d,2,optim(0.3,opt1,method="BFGS")
> and even:
> For (I in 1:length(pop))apply(d,2,optim(0.3,opt1,method="BFGS"))
>
> Every time I get the same error message
>
> Error in optim(0.3, opt1, method = "BFGS") :
>         objective function in optim evaluates to length 18 not 1
>
> So the apply function is returning 18 values of F which I want but the
> function only wants to return 1 value.
>
> Any Suggestions.
> Thanks,
> Cam
>
> ______________________________________________
> [hidden email] mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide!
> http://www.R-project.org/posting-guide.html
>

______________________________________________
[hidden email] 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 | Threaded
Open this post in threaded view
|

Re: apply

Sundar Dorai-Raj
In addition the error message explicitly says:

Error in optim(0.3, opt1, method = "BFGS") :
      objective function in optim evaluates to length 18 not 1

And from the objective function we see

opt1 <- function (x) {
   Z <- x + M
   c.hat <- (x/Z)*pop*(1-exp(-Z))
   y <- (catch - c.hat)^2
   return(y)
}

The last line should be replaced by:

sum(y)

rather than "return(y)". See ?optim, ?apply, and the reference Bert
gives below.

HTH,

--sundar


Berton Gunter wrote:

> You are not calling apply() properly. Please read relevant reference
> material carefully. You might also wish to pick up one of the several good
> books on R (check CRAN website) -- I like V&R's S PROGRAMMING.
>
> I did not go through your example in detail, but your apply() call should be
> of the form
>
> apply(d,2,function(x)optim(x,...))
>
> You may or may not get into scoping problems with the opt1 argument and have
> to pass it in explicitly -- I can't remember how things work with optim.
>
> -- Bert Gunter
> Genentech Non-Clinical Statistics
> South San Francisco, CA
>  
> "The business of the statistician is to catalyze the scientific learning
> process."  - George E. P. Box
>  
>  
>
>
>>-----Original Message-----
>>From: [hidden email]
>>[mailto:[hidden email]] On Behalf Of
>>Guenther, Cameron
>>Sent: Friday, January 13, 2006 11:03 AM
>>To: [hidden email]
>>Subject: [R] apply
>>
>>Hello,
>>I have a dataset d which is
>> >d
>>         pop     catch
>>1   66462.01 10807.757
>>2   87486.73 46257.885
>>3   57211.64  9345.058
>>4   71321.62  4892.868
>>5  100024.89 27334.248
>>6  104504.91 48535.092
>>7   95295.51 39348.195
>>8   93737.35 34343.489
>>9   89375.05 28750.743
>>10  95312.65 30755.064
>>11 100888.17 55404.370
>>12  84790.23 37751.074
>>13  81129.82 29277.443
>>14  69797.09 21500.398
>>15  61690.34 18199.664
>>16  60671.08 19349.051
>>17  62852.57 16300.982
>>18  90646.32 34793.148
>>
>>And a function opt1:
>>
>>opt1 <- function (x) {
>>  Z <- x + M
>>  c.hat <- (x/Z)*pop*(1-exp(-Z))
>>  y <- (catch - c.hat)^2
>>  return(y)
>>  }
>>
>>And define M = 0.25
>>For each row I want to return a value F that is a minimization of the
>>opt1 function
>>
>>I have tried many variations of:
>>d$F<-apply(d,2,optim(0.3,opt1,method="BFGS")
>>and even:
>>For (I in 1:length(pop))apply(d,2,optim(0.3,opt1,method="BFGS"))
>>
>>Every time I get the same error message
>>
>>Error in optim(0.3, opt1, method = "BFGS") :
>>        objective function in optim evaluates to length 18 not 1
>>
>>So the apply function is returning 18 values of F which I want but the
>>function only wants to return 1 value.
>>
>>Any Suggestions.
>>Thanks,
>>Cam
>>
>>______________________________________________
>>[hidden email] mailing list
>>https://stat.ethz.ch/mailman/listinfo/r-help
>>PLEASE do read the posting guide!
>>http://www.R-project.org/posting-guide.html
>>
>
>
> ______________________________________________
> [hidden email] mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html

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