Dear All,

Many thanks for your replies.

My PC1 loading turns out to be :

1/sqrt(2) , -1/sqrt(2)

In simple words : I had 2 variables and I ran prcomp on them. I got my
PC1 as :  .7071068 var1 - .7071068 var2

PC2 turned out to be the same as PC1 with a PLUS replacing the minus,
ie. .7071068 var1 + .7071068 var2

But forget PC2 for the time being.

Now my question is : I am not able to use the rule that : choose the
variable with a bigger magnitude of loading and multiply PC1 by -1 if
needed (to flip the PC1 since any vector x and it's flipped version -x
 are the same vector but with opposite direction) if the variable with
bigger magnitude is of negative sign.

I have an alternative measure of stress which is trending UP and has 2
peaks during 2 recessions and I can see that PC1 is trending DOWN and
has 2 TROUGHS during the same recessions. That's how I wish to FLIP
PC1 with a negative sign.

The data is not mine and I am not at liberty to share it. I can
construct an artificial example but I would need time to do that.

That's what's happening.

Best Regards and
Many thanks.
Ashim









On Thu, Oct 13, 2022 at 5:38 PM Ebert,Timothy Aaron <teb...@ufl.edu> wrote:
>
> I still do not understand. However, the general approach would be to identify 
> a specific value to test. If the test is TRUE then do "this" otherwise do 
> nothing. Once the test condition is properly identified, the coding easily 
> follows.
>
>  abs() is the same as
> if x<0 then x = -x   (non-R code, just idea)
> The R code might look something more like
> for (number in 1:ncol(x)){
>    if (x[3,2] < 0) {
>          x[number, number] = -x[number, number] #only change the diagonal
>    }
> }
>
> Depending on what values need to be changed you may need a nested for loop to 
> go through all values of x[number1, number2].
>
> Your words: " I can forcefully use a NEGATIVE sign to FLIP the index when it 
> is LOW." Where it appeared that "low" was defined as values that are 
> negative. You still will have low values (close to zero) and high values (far 
> from zero).
>
> You could make the condition some other value:
>
> if x< -4 then x = -x
>
> If you just want to rotate about zero then
> x = -x
> In this case the positive values will become negative and the negative values 
> positive.
> Add an if test to selectively rotate based on the value of a single test 
> element in x (as in x[3,2]).
>
> In debugging or trouble shooting setting seed is useful. For actual data 
> analysis you should not set seed, or possibly better yet use set.seed(NULL).
>
> Tim
>
>
>
> -----Original Message-----
> From: Ashim Kapoor <ashimkap...@gmail.com>
> Sent: Thursday, October 13, 2022 12:28 AM
> To: Ebert,Timothy Aaron <teb...@ufl.edu>
> Cc: R Help <r-help@r-project.org>
> Subject: Re: [R] prcomp - arbitrary direction of the returned principal 
> components
>
> [External Email]
>
> Dear Aaron,
>
> Many thanks for your reply.
>
> Please allow me to illustrate my query a bit.
>
> I take some data, throw it to prcomp and extract the x data frame from prcomp.
>
> From ?prcomp:
>
>        x: if 'retx' is true the value of the rotated data (the centred
>           (and scaled if requested) data multiplied by the 'rotation'
>           matrix) is returned.  Hence, 'cov(x)' is the diagonal matrix
>           'diag(sdev^2)'.  For the formula method, 'napredict()' is
>           applied to handle the treatment of values omitted by the
>           'na.action'.
>
> I consider x[,1] as my index. This makes sense as x[,1] is the projection of 
> the data on the FIRST principal component.
> Now this x[,1] can be a high +ve number or a low -ve number. I can't ignore 
> the sign.
>
> If I ignore the sign by taking the absolute value, the HIGH / LOW stress 
> values will be indistinguishable.
>
> Hence I do not think using absolute values of x[,1] is the solution.
> Yes it will make the results REPRODUCIBLE but that will be at the cost of 
> losing information.
>
> Any other idea ?
>
> Many thanks,
> Ashim
>
> On Wed, Oct 12, 2022 at 5:23 PM Ebert,Timothy Aaron <teb...@ufl.edu> wrote:
> >
> > Use absolute value
> >
> > Tim
> >
> > -----Original Message-----
> > From: R-help <r-help-boun...@r-project.org> On Behalf Of Ashim Kapoor
> > Sent: Wednesday, October 12, 2022 7:48 AM
> > To: R Help <r-help@r-project.org>
> > Subject: [R] prcomp - arbitrary direction of the returned principal
> > components
> >
> > [External Email]
> >
> > Dear R experts,
> >
> > From ?prcomp,
> >
> > ---- snip -----
> > Note:
> >
> >      The signs of the columns of the rotation matrix are arbitrary, and
> >      so may differ between different programs for PCA, and even between
> >      different builds of R.
> > ---- snip ------
> >
> > My problem is that I am building an index based on Principal Components 
> > Analysis.
> > When the index is high it should indicate stress in the market. Due to the 
> > arbitrary sign sometimes I get an index which is HIGH when there is stress 
> > and sometimes I get  the OPPOSITE - an index which is LOW when there is 
> > stress.
> > This program is shared with other people who may have a different build of 
> > R.
> >
> > I can forcefully use a NEGATIVE sign to FLIP the index when it is LOW.
> > That works.
> >
> > Now my query is : Just like we do set.seed(1234) and force the pattern of 
> > generation of random number and make it REPRODUCIBLE, can I do something 
> > like :
> >
> > set.direction.for.vector.in.pca(1234)
> >
> > Now each time I do prcomp it should choose the SAME ( high or low ) 
> > direction of the principle component on ANY computer having ANY version of 
> > R installed.
> >
> > That's what I want. I don't want the the returned principal component to be 
> > HIGH(LOW) on my computer and LOW(HIGH) on someone else's computer.
> > That would confuse the people the code is shared with.
> >
> > Is this possible ? How do people deal with this ?
> >
> > Many thanks,
> > Ashim
> >
> > ______________________________________________
> > R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
> > https://nam10.safelinks.protection.outlook.com/?url=https%3A%2F%2Fstat
> > .ethz.ch%2Fmailman%2Flistinfo%2Fr-help&amp;data=05%7C01%7Ctebert%40ufl
> > .edu%7C60e6d6ae8645462db99b08daacd36b76%7C0d4da0f84a314d76ace60a62331e
> > 1b84%7C0%7C0%7C638012321302591064%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4w
> > LjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C
> > &amp;sdata=AHMEDU%2BTyInvW%2FH6EZQteO1qZ%2BtW3JZfybfaveTD8Yk%3D&amp;re
> > served=0 PLEASE do read the posting guide
> > https://nam10.safelinks.protection.outlook.com/?url=http%3A%2F%2Fwww.r
> > -project.org%2Fposting-guide.html&amp;data=05%7C01%7Ctebert%40ufl.edu%
> > 7C60e6d6ae8645462db99b08daacd36b76%7C0d4da0f84a314d76ace60a62331e1b84%
> > 7C0%7C0%7C638012321302591064%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwM
> > DAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&amp;
> > sdata=yavXAiQorhZjPTozG4Ulo8SuNmR6XFhvA%2FLX9Tfwgi0%3D&amp;reserved=0
> > and provide commented, minimal, self-contained, reproducible code.

______________________________________________
R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
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.

Reply via email to