Gerrit Draisma
2011-Nov-14 10:32 UTC
[R] how to include integrate in a function that can be solved with uniroot?
Hallo,
I am trying to define expectation as an integral
and use uniroot to find the distribution parameter
for a given expectation.
However I fail to understand how to define properly
the functions involved and pass the parameters correctly.
Can anyone help me out?
Thanks,
Gerrit Draisma.
This what I tried:
====== > # exponential density
> g <- function(x,lambda){ lambda *exp(-lambda*x) }
>
> # expectation with lambda=1/10
> integrate(f = function(x,lambda=1/10) {x*g(x,lambda)}, 0,Inf)
10 with absolute error < 6.7e-05
>
> # *how to write this as a function?*
> E <- function(lambda) {
+ integrate( f = function(x,th){x*g(x,lambda)},
+ 0,Inf)$Value}
> E(1/10)
NULL
>
> # *how to include this function in uniroot to find lambda*
> # *for a given expectation?*
> mu <- 10
> uniroot(f<-function(th){E(th)-mu},lower=1,upper=100)
Error in if (is.na(f.lower)) stop("f.lower = f(lower) is NA") :
argument is of length zero
>
========
R. Michael Weylandt
2011-Nov-14 13:50 UTC
[R] how to include integrate in a function that can be solved with uniroot?
Try this:
EV <- function(lamb){
fnc <- function(x) x * dexp(x, lamb)
integrate(fnc, 0, Inf)$value
}
Your problem is that there's nothing to translate th to lambda in your
code for E.
Michael
On Mon, Nov 14, 2011 at 5:32 AM, Gerrit Draisma <gdraisma at xs4all.nl>
wrote:> Hallo,
> I am trying to define expectation as an integral
> and use uniroot to find the distribution parameter
> for a given expectation.
>
> However I fail to understand how to define properly
> the functions involved and pass the parameters correctly.
>
> Can anyone help me out?
>
> Thanks,
> Gerrit Draisma.
>
>
> This what I tried:
> ======>> # exponential density
>> g <- function(x,lambda){ lambda *exp(-lambda*x) }
>>
>> # expectation with lambda=1/10
>> integrate(f = function(x,lambda=1/10) {x*g(x,lambda)}, 0,Inf)
> 10 with absolute error < 6.7e-05
>>
>> # *how to write this as a function?*
>> E <- function(lambda) {
> + ? ? ?integrate( f = function(x,th){x*g(x,lambda)},
> + ? ? ?0,Inf)$Value}
>> E(1/10)
> NULL
>>
>> # *how to include this function in uniroot to find lambda*
>> # *for a given expectation?*
>> mu <- 10
>> uniroot(f<-function(th){E(th)-mu},lower=1,upper=100)
> Error in if (is.na(f.lower)) stop("f.lower = f(lower) is NA") :
> ?argument is of length zero
>>
> =======>
> ______________________________________________
> R-help at r-project.org 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. Michael Weylandt
2011-Nov-14 14:30 UTC
[R] how to include integrate in a function that can be solved with uniroot?
You need to explicitly pass th to your function with the ... argument
of integrate.
E <- function(th){
integrate(function(x,th) x*g(x, th), 0, Inf, th)$value
}
Also, it's value, not Value, which might be producing errors of another
sort.
Michael
On Mon, Nov 14, 2011 at 9:16 AM, Gerrit Draisma <gdraisma at xs4all.nl>
wrote:> Thanks Michael,
>
> I see now how to include integrate function in the EV function.
> And apologies:
> I now realize that my code was sloppy.
> I intended to write
>> E<- function(th) {
>> + ? ? ?integrate( f = function(x,th){x*g(x,th)},
>> + ? ? ?0,Inf)$Value}
>> E(1/10)
> But that does not work either,
>
> Gerrit.
>
> Op 11/14/2011 2:50 PM, R. Michael Weylandt schreef:
>>
>> Try this:
>>
>> EV<- function(lamb){
>> ? ? ?fnc<- function(x) x * dexp(x, lamb)
>> ? ? ?integrate(fnc, 0, Inf)$value
>> }
>>
>> Your problem is that there's nothing to translate th to lambda in
your
>> code for E.
>>
>> Michael
>>
>> On Mon, Nov 14, 2011 at 5:32 AM, Gerrit Draisma<gdraisma at
xs4all.nl>
>> ?wrote:
>>>
>>> Hallo,
>>> I am trying to define expectation as an integral
>>> and use uniroot to find the distribution parameter
>>> for a given expectation.
>>>
>>> However I fail to understand how to define properly
>>> the functions involved and pass the parameters correctly.
>>>
>>> Can anyone help me out?
>>>
>>> Thanks,
>>> Gerrit Draisma.
>>>
>>>
>>> This what I tried:
>>> ======>>>>
>>>> # exponential density
>>>> g<- function(x,lambda){ lambda *exp(-lambda*x) }
>>>>
>>>> # expectation with lambda=1/10
>>>> integrate(f = function(x,lambda=1/10) {x*g(x,lambda)}, 0,Inf)
>>>
>>> 10 with absolute error< ?6.7e-05
>>>>
>>>> # *how to write this as a function?*
>>>> E<- function(lambda) {
>>>
>>> + ? ? ?integrate( f = function(x,th){x*g(x,lambda)},
>>> + ? ? ?0,Inf)$Value}
>>>>
>>>> E(1/10)
>>>
>>> NULL
>>>>
>>>> # *how to include this function in uniroot to find lambda*
>>>> # *for a given expectation?*
>>>> mu<- 10
>>>> uniroot(f<-function(th){E(th)-mu},lower=1,upper=100)
>>>
>>> Error in if (is.na(f.lower)) stop("f.lower = f(lower) is
NA") :
>>> ?argument is of length zero
>>>>
>>> =======>>>
>>> ______________________________________________
>>> R-help at r-project.org 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.
>>>
>>
>