Question: The signs of the eigenvectors in the `eigen` function change depending on the specification of the `symmetric` argument. Consider the following example:

```
set.seed(1234)
data <- matrix(rnorm(200),nrow=100)
cov.matrix <- cov(data)
vectors.1 <- eigen(cov.matrix,symmetric=TRUE)$vectors
vectors.2 <- eigen(cov.matrix,symmetric=FALSE)$vectors
#The second and third eigenvectors have opposite sign
all(vectors.1 == vectors.2)
FALSE

```

This also has implications for principal component analysis as the `princomp` function appears to calculate the eigenvectors for the covariance matrix using the `eigen` function with `symmetric` set to `TRUE`. 

```
pca <- princomp(data)
#princomp uses vectors.1
pca$loadings
Loadings:
       Comp.1 Comp.2
 [1,] -0.366 -0.931
 [2,]  0.931 -0.366

               Comp.1 Comp.2
SS loadings       1.0    1.0
Proportion Var    0.5    0.5
Cumulative Var    0.5    1.0
vectors.1
           [,1]       [,2]
[1,] -0.3659208 -0.9306460
[2,]  0.9306460 -0.3659208

```

Can someone please explain the source or reasoning behind the discrepancy?

Answer: 
Linear algebra libraries like [LAPACK](http://en.wikipedia.org/wiki/LAPACK) contain multiple subroutines for carrying out operations like eigendecompositions. The particular subroutine used in any given case may depend on the type of matrix being decomposed, and the pieces of that decomposition needed by the user.

As you can see in this snippet from `eigen`'s code, it dispatches different LAPACK subroutines depending on whether `symmetric=TRUE` or `symmetric=FALSE` (and also, on whether the matrix is real or complex).

```
if (symmetric) {
    z <- if (!complex.x) 
        .Internal(La_rs(x, only.values))
    else .Internal(La_rs_cmplx(x, only.values))
    ord <- rev(seq_along(z$values))
}
else {
    z <- if (!complex.x) 
        .Internal(La_rg(x, only.values))
    else .Internal(La_rg_cmplx(x, only.values))
    ord <- sort.list(Mod(z$values), decreasing = TRUE)
}

```

Based on pointers in `?eigen`, `La_rs()` (used when `symmetric=TRUE`) appears to refer to [dsyevr](http://linux.die.net/man/l/dsyevr) while `La_rg()` refers to [dgeev](http://linux.die.net/man/l/dgeev).

To learn **exactly** why those two algorithms switch some of the signs of the eigenvectors of the matrix you've handed to `eigen()`, you'd have to dig into the FORTRAN code used to implement them. (Since, as others have noted, the sign is irrelevant, I'm guessing you won't want to dig quite that deep ;).
If you want to change the sign of eigenvector elements, then simply ensure $\mathbf{1}^T\mathbf{e}>1$. In other words, sum all the elements in each eigenvector, and ensure the sum is greater than one. If not, change the sign of each element to the opposite sign. This is the trick to get the sign of eigenvector elements, principal components, and loadings in PCA to come out the same as most statistical software.