[R] Beyond double-precision?

2009-05-08 Thread joaks1

I need to perform some calculations with some extremely small numbers (i.e.
likelihood values on the order of 1.0E-16,000).  Even when using the
double() function, R is rounding these values to zero.  Is there any way to
get R to deal with such small numbers?

For example, I would like to be able to calculate e^-1 (i.e.
exp(-1)) without the result being rounded to zero.

I know I can do it in Mathematica, but I would prefer to use R if I can. 
Any help would be appreciated!

Many Thanks in Advance!
-- 
View this message in context: 
http://www.nabble.com/Beyond-double-precision--tp23452471p23452471.html
Sent from the R help mailing list archive at Nabble.com.

__
R-help@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.


Re: [R] Beyond double-precision?

2009-05-09 Thread joaks1

Yes, all of the numbers are positive.  I actually have a Bayesian posterior
sample of log likelihoods [i.e. thousands of ln(likelihood) scores].  I want
to calculate the harmonic mean of these likelihoods, which means I need to
convert them back into likelihoods [i.e. e^ln(likelihood)], calculate the
harmonic mean, and then take the log of the mean.  I have done this before
in Mathematica, but I have a simulation pipeline written almost entirely in
R, so it would be nice if I could do these calculations in R.

If R cannot handle such small values, then perhaps there's a way to
calculate the harmonic mean from the log likelihood scores without
converting back to likelihoods?  I am a biologist, not a mathematician, so
any recommendations are welcome!  Thanks! -Jamie


spencerg wrote:
> 
>   Are all your numbers positive?  If yes, have you considered using 
> logarithms? 
> 
>   I would guess it is quite rare for people to compute likelihoods.  
> Instead I think most people use log(likelihoods).  Most of the 
> probability functions in R have an option of returning the logarithms. 
> 
>   Hope this helps. 
>   Spencer
> 
> joaks1 wrote:
>> I need to perform some calculations with some extremely small numbers
>> (i.e.
>> likelihood values on the order of 1.0E-16,000).  Even when using the
>> double() function, R is rounding these values to zero.  Is there any way
>> to
>> get R to deal with such small numbers?
>>
>> For example, I would like to be able to calculate e^-1 (i.e.
>> exp(-1)) without the result being rounded to zero.
>>
>> I know I can do it in Mathematica, but I would prefer to use R if I can. 
>> Any help would be appreciated!
>>
>> Many Thanks in Advance!
>>
> 
> __
> R-help@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.
> 
> 

-- 
View this message in context: 
http://www.nabble.com/Beyond-double-precision--tp23452471p23457955.html
Sent from the R help mailing list archive at Nabble.com.

__
R-help@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.


Re: [R] Beyond double-precision?

2009-05-09 Thread joaks1

Thanks Berwin, Spencer, and Gabor!!!


Berwin A Turlach wrote:
> 
> G'day all,
> 
> On Sat, 09 May 2009 08:01:40 -0700
> spencerg  wrote:
> 
>>   The harmonic mean is exp(mean(logs)).  Therefore, log(harmonic 
>> mean) = mean(logs). 
>> 
>>   Does this make sense?
> 
> I think you are talking here about the geometric mean and not the
> harmonic mean. :)
> 
> The harmonic mean is a bit more complicated.  If x_i are positive
> values, then the harmonic mean is
> 
> H= n / (1/x_1 + 1/x_2 + ... + 1/x_n)
> 
> so
> 
> log(H) = log(n) - log( 1/x_1 + 1/x_2 + ... + 1/x_n)
> 
> now log(1/x_i) = -log(x_i) so if log(x_i) is available, the logarithm
> of the individual terms are easily calculated.  But we need to
> calculate the logarithm of a sum from the logarithms of the individual
> terms.  
> 
> At the C level R's API has the function logspace_add for such tasks, so
> it would be easy to do this at the C level.  But one could also
> implement the equivalent of the C routine using R commands.  The way to
> calculate log(x+y) from lx=log(x) and ly=log(y) according to
> logspace_add is:
> 
>   max(lx,ly) + log1p(exp(-abs(lx-ly)))
> 
> So the following function may be helpful:
> 
> logadd <- function(x){
>   logspace_add <- function(lx, ly)
> max(lx, ly) + log1p(exp(-abs(lx-ly)))
> 
>   len_x <- length(x)
>if(len_x > 1){
> res <- logspace_add(x[1], x[2])
> if( len_x > 2 ){
>   for(i in 3:len_x)
> res <- logspace_add(res, x[i])
> }
>   }else{
> res <- x
>   }
>   res
> }
> 
> R> set.seed(1)
> R> x <- runif(50)
> R> lx <- log(x)
> R> log(1/mean(1/x))  ## logarithm of harmonic mean
> [1] -1.600885
> R> log(length(x)) - logadd(-lx)
> [1] -1.600885
> 
> Cheers,
> 
>   Berwin
> 
> === Full address =
> Berwin A TurlachTel.: +65 6515 4416 (secr)
> Dept of Statistics and Applied Probability+65 6515 6650 (self)
> Faculty of Science  FAX : +65 6872 3919   
> National University of Singapore
> 6 Science Drive 2, Blk S16, Level 7  e-mail: sta...@nus.edu.sg
> Singapore 117546http://www.stat.nus.edu.sg/~statba
> 
> __
> R-help@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.
> 
> 

-- 
View this message in context: 
http://www.nabble.com/Beyond-double-precision--tp23452471p23466589.html
Sent from the R help mailing list archive at Nabble.com.

__
R-help@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.