# LDA example in multivariatestats.jl flipped x and y values

**URL:** <https://discourse.julialang.org/t/lda-example-in-multivariatestats-jl-flipped-x-and-y-values/110508>\
**Category:** General Usage\
**Tags:** question, package\
**Created:** [February 21, 2024, 11:03am UTC](https://discourse.julialang.org/t/lda-example-in-multivariatestats-jl-flipped-x-and-y-values/110508 "2024-02-21T11:03:56Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![jcbritobr](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jcbritobr/32/219275_2.png) [@jcbritobr](https://discourse.julialang.org/u/jcbritobr)\
**Post date:** [February 21, 2024, 11:03am UTC](https://discourse.julialang.org/t/lda-example-in-multivariatestats-jl-flipped-x-and-y-values/110508/1 "2024-02-21T11:03:56Z")

</div>

Hello, good morning.

Days ago I started looking the multivariatestats.jl to do some pca and lda analysis, and notice that lda plots data inverted in this example:

[https://juliastats.org/MultivariateStats.jl/stable/lda/](https://juliastats.org/MultivariateStats.jl/stable/lda/)

```julia
	iris = dataset("datasets", "iris")

	X = Matrix(iris[1:2:end,1:4])'
	X_labels = Vector(iris[1:2:end,5])
	
	pca = fit(PCA, X; maxoutdim=2)
	Ypca = predict(pca, X)

	lda = fit(MulticlassLDA, X, X_labels; outdim=2)
	Ylda = predict(lda, X)
	
	p = plot(layout=(1,2), size=(800,300))
	
	for s in ["setosa", "versicolor", "virginica"]
	
	    points = Ypca[:,X_labels.==s]
	    scatter!(p[1], points[1,:],points[2,:], label=s, legend=:bottomleft)
	    points = Ylda[:,X_labels.==s]
	    scatter!(p[2], points[1,:],points[2,:], label=s, legend=:bottomleft)
	
	end
	plot!(p[1], title="PCA")
	plot!(p[2], title="LDA")

```

[https://juliastats.org/MultivariateStats.jl/stable/lda/](https://juliastats.org/MultivariateStats.jl/stable/lda/)

From page example:

 ![image](https://global.discourse-cdn.com/julialang/original/3X/0/2/02a6d37d8730a18f245bad890d16f8d2b6ddb570.png)

From my machine

 ![image](https://global.discourse-cdn.com/julialang/original/3X/1/2/122904ded675764521def80a60de36778c140744.png)

Is this a bug, or different results are normal?

---

<div class="post-metadata">

**Author:** ![Mattriks](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mattriks/32/351_2.png) [@Mattriks](https://discourse.julialang.org/u/Mattriks)\
**Post date:** [February 23, 2024, 12:06pm UTC](https://discourse.julialang.org/t/lda-example-in-multivariatestats-jl-flipped-x-and-y-values/110508/2 "2024-02-23T12:06:02Z")

</div>

LDA is easy to implement, so here is LDA based on inverse regression.

```julia
iris = dataset("datasets", "iris")

# Note I don't transpose X
X = Matrix(iris[1:2:end,1:4])
X_labels = Vector(iris[1:2:end,5]);

using Statistics, LinearAlgebra, DataFrames

indmat(Iv) = (Iv.==permutedims(unique(Iv)))

function lda(X, Xlbls)
    μX = mean(X, dims=1)
    Xw = svd(X.-μX).U # whiten X
    Xw ./= std(Xw, dims=1) # make unit variance
    Ya = indmat(Xlbls)
    Σh = cov(Xw, Ya)/cov(Ya)*cov(Ya,Xw) # Prediction covariance
    V = eigvecs(Σh, sortby=x->-abs(x))
    DC = Xw*V # Discriminant Components
    df = DataFrame(DC, [:DC1, :DC2, :DC3, :DC4])
    df.xlbl = Xlbls  
    return df
end

DC = lda(X, X_labels)

# Plot

```

![LDA](https://global.discourse-cdn.com/julialang/original/3X/7/0/70fd4f186553101e1bb6870ccd76f49e3a712ba6.png)  
So the discriminant vectors `V` are the eigenvectors of a prediction covariance matrix `Σh`.  
I guess you know that eigenvectors are not unique and only defined up to a multiple  
(so yes you can get inverted signs). Note my DCs are centered and have unit variance (which is my preference).

---

<div class="post-metadata">

**Author:** ![jcbritobr](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jcbritobr/32/219275_2.png) [@jcbritobr](https://discourse.julialang.org/u/jcbritobr)\
**Post date:** [February 24, 2024, 12:36pm UTC](https://discourse.julialang.org/t/lda-example-in-multivariatestats-jl-flipped-x-and-y-values/110508/3 "2024-02-24T12:36:52Z")

</div>

thats means results in multivariatestats.jl are correct, even if thei are flipped?

---

<div class="post-metadata">

**Author:** ![Mattriks](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mattriks/32/351_2.png) [@Mattriks](https://discourse.julialang.org/u/Mattriks)\
**Post date:** [February 25, 2024, 9:01am UTC](https://discourse.julialang.org/t/lda-example-in-multivariatestats-jl-flipped-x-and-y-values/110508/4 "2024-02-25T09:01:27Z")

</div>

The scatterplot looks correct. But their non-centered DC2 would prompt me to look at the MultivariateStats.jl code (if I was using it).

---

<div class="post-metadata">

**Author:** ![jcbritobr](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jcbritobr/32/219275_2.png) [@jcbritobr](https://discourse.julialang.org/u/jcbritobr)\
**Post date:** [February 25, 2024, 2:08pm UTC](https://discourse.julialang.org/t/lda-example-in-multivariatestats-jl-flipped-x-and-y-values/110508/5 "2024-02-25T14:08:29Z")

</div>

Thank you. I had opened an issue in github. Will wait people do their cents before I close it.
