[R] function for inverse normal transformation

David L Carlson dcarlson at tamu.edu
Fri Jul 20 16:12:06 CEST 2012


Rui's example included z-score data (drawn from rnorm). You converted your
data to z-scores so you need to compare your results to the z-scores not
the original data.

Change these lines:

tmp.qnorm = qnorm(tmp.p/2,lower.tail=FALSE)*sign(scale(tmp))
# sign is of scale(tmp) not tmp
equal(scale(tmp), tmp.qnorm)
# compare to scale(tmp) not tmp

----------------------------------------------
David L Carlson
Associate Professor of Anthropology
Texas A&M University
College Station, TX 77843-4352

> -----Original Message-----
> From: r-help-bounces at r-project.org [mailto:r-help-bounces at r-
> project.org] On Behalf Of carol white
> Sent: Friday, July 20, 2012 7:29 AM
> To: Rui Barradas
> Cc: r-help at r-project.org
> Subject: Re: [R] function for inverse normal transformation
> 
> Thanks Rui.
> I changed my scripts to the followings and I think that it still is not
> correct. See also the attached file.
> 
> Thanks for your help,
> 
> 
>  tmp
>  [1]  2.502519  1.828576  3.755778 17.415000  3.779296  2.956850
> 2.379663
>  [8]  1.103559  8.920316  2.744500  2.938480  7.522174 10.629200
> 8.552259
> [15]  5.425938  4.388906  0.000000  0.723887 11.337860  3.763786
> 
> 
>  tmp.p =2*pnorm(abs(scale(tmp)),lower.tail=FALSE)
> >  tmp.qnorm = qnorm(tmp.p/2,lower.tail=FALSE)
> >  tmp.qnorm = qnorm(tmp.p/2,lower.tail=FALSE)*sign(tmp)
> > equal(tmp, tmp.qnorm)
> [1] FALSE
> > par(mfrow = c(1,3))
> > hist(tmp)
> > hist(tmp.p)
> > hist(tmp.qnorm)
> 
> 
> 
> ________________________________
>  From: Rui Barradas <ruipbarradas at sapo.pt>
> To: carol white <wht_crl at yahoo.com>
> Cc: r-help <r-help at r-project.org>
> Sent: Friday, July 20, 2012 2:02 PM
> Subject: Re: [R] function for inverse normal transformation
> 
> 
> Hello,
> 
> No it's not correct, you are computing a what seems to be a
>     two-tailed probabiity, so the inverse should account for it. Look
>     closely: you take the absolute value, then the upper tail
>     probability, then multiply 2 into it. Reverse these steps to get
> the
>     correct value.
> 
> # Helper function
> equal <- function(x, y, tol=.Machine$double.eps^0.5) all(abs(x -
>     y)  < tol)
> 
> m <- rnorm(5)
> p <- 2*pnorm(abs(m), lower.tail=FALSE)
> m2 <- qnorm(p/2, lower.tail=FALSE)*sign(m)
> 
> equal(m, m2)
> 
> (The helper function is just to test floating point values computed
>     differently for equality.)
> 
> Hope this helps,
> 
> Rui Barradas
> 
> 
> Em 20-07-2012 12:36, carol white escreveu:
> 
> Thanks for your reply. So to derive it from a given data set, is the
> following correct to do? my_data.p
> =2*pnorm(abs(my_data),lower.tail=FALSE) my_data.q = qnorm(my_data.p)
> Cheers, ________________________________ From: Duncan Murdoch
> <murdoch.duncan at gmail.com> Cc: "r-help at stat.math.ethz.ch" <r-
> help at stat.math.ethz.ch> Sent: Friday, July 20, 2012 1:23 PM
> Subject: Re: [R] function for inverse normal transformation On 12-07-20
> 6:21 AM, carol white wrote:
> >Hi,
> What is the function for inverse normal transformation?
> >qnorm Duncan Murdoch
> >Thanks, Carol     [[alternative HTML version deleted]]
> ______________________________________________ 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.
> >[[alternative HTML version deleted]]
> >
> >
> >______________________________________________ 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.



More information about the R-help mailing list