From 0994361dee518fecf917fa9dcdde5bce520aa459 Mon Sep 17 00:00:00 2001 From: "W. Trevor King" Date: Sat, 16 Mar 2013 13:02:53 -0400 Subject: [PATCH] posts:factor_analysis: Add a post on Factor Analysis This is the statistical approach used to analyze Software Carpentry surveys, so I've been figuring out how it works. --- posts/Factor_analysis.mdwn_itex | 279 ++++++ posts/Factor_analysis/color-ball.py | 239 +++++ posts/Factor_analysis/factors.dia | 1444 +++++++++++++++++++++++++++ posts/Factor_analysis/factors.png | Bin 0 -> 28824 bytes posts/Factor_analysis/survey.data | 15 + 5 files changed, 1977 insertions(+) create mode 100644 posts/Factor_analysis.mdwn_itex create mode 100755 posts/Factor_analysis/color-ball.py create mode 100644 posts/Factor_analysis/factors.dia create mode 100644 posts/Factor_analysis/factors.png create mode 100644 posts/Factor_analysis/survey.data diff --git a/posts/Factor_analysis.mdwn_itex b/posts/Factor_analysis.mdwn_itex new file mode 100644 index 0000000..f48295e --- /dev/null +++ b/posts/Factor_analysis.mdwn_itex @@ -0,0 +1,279 @@ +I've been trying to wrap my head around [factor analysis][FA] as a +theory for designing and understanding test and survey results. This +has turned out to be [[another|Gumbel-Fisher-Tippett_distributions]] +one of those fields where the going has been a bit rough. I think the +key factors in making these older topics difficult are: + +* “Everybody knows this, so we don't need to write up the details.” +* “Hey, I can do better than Bob if I just tweak this knob…” + +The resulting discussion ends up being overly complicated, and it's +hard for newcomers to decide if people using similar terminology are +in fact talking about the same thing. + +Some of the better open sources for background has been [Tucker and +MacCallum's “Exploratory Factor Analysis” manuscript][TM] and [Max +Welling's notes][MW]. I'll use Welling's terminology for this +discussion. + +The basic idea of factor analsys is to model $d$ measurable attributes +as generated by $k < d$ common factors and $d$ unique factors. +With $n = 4$ and $k = 2$, you get something like: + +[[!img factors.png + alt="Relationships between factors and measured attributes" + caption="Relationships between factors and measured attributes + (adapted from Tucker and MacCallum's Figure 1.2)" + ]] + +Corresponding to the equation ([Welling's eq. 1][MW-FA]): + +\[ + \mathbf{x} = \mathbf{A}\mathbf{y} + \mathbf{\mu} + \mathbf{\nu} +\] + +The independent random variables $\mathbf{y}$ are distributed +according to a Gaussian with zero mean and unit +variance $\mathcal{G}_\mathbf{y}[0,\mathbf{I}]$ (zero mean because +constant offsets are handled by $\mathbf{\mu}$; unit variance becase +scaling is handled by $\mathbf{A}$). The independent random +variables $\mathbf{\nu}$ are distributed according +to $\mathcal{G}_\mathbf{\nu}[0,\mathbf{\Sigma}]$, with (Welling's +eq. 2): + +\[ + \mathbf{\Sigma} \equiv \text{diag}[\sigma_1^2, \ldots, \sigma_d^2] +\] + +Because the only source of constant offset is $\mathbf{\mu}$, we can +calculate it by averaging out the random noise (Welling's eq. 6): + +\[ + \mathbf{\mu} = \frac{1}{N} \sum_{n=1}^N \mathbf{x}_n +\] + +where $N$ is the number of measurements (survey responders) +and $\mathbf{x}_n$ is the response vector for the $n^\text{th}$ +responder. + +How do we find $\mathbf{A}$ and $\mathbf{\Sigma}$? This is the tricky +bit, and there are a number of possible approaches. Welling suggests +using expectation maximization (EM), and there's an excellent example +of the procedure with a colorblind experimenter drawing colored balls +in his [EM notes][EM] (to test my understanding, I wrote +[[color-ball.py]]). + +To simplify calculations, Welling defines (before eq. 15): + +\[ +\begin{aligned} + \mathbf{A}' &\equiv [\mathbf{A}, \mathbf{\mu}] \\ + \mathbf{y}' &\equiv [\mathbf{y}^T, 1]^T +\end{aligned} +\] + +which reduce the model to + +\[ + \mathbf{x} = \mathbf{A}'\mathbf{y}' + \mathbf{\nu} +\] + +After some manipulation Welling works out the maximizing updates +(eq'ns 16 and 17): + +\[ +\begin{aligned} + \mathbf{A}'^\text{new} + &= \left( \sum_{n=1}^N \mathbf{x}_n + \mathbf{E}[\mathbf{y}'|\mathbf{x}_n]^T \right) + \left( \sum_{n=1}^N \mathbf{x}_n + \mathbf{E}[\mathbf{y}'\mathbf{y}'^T|\mathbf{x}_n] + \right)^{-1} \\ + \mathbf{\Sigma}^\text{new} + &= \frac{1}{N}\sum_{n=1}^N + \text{diag}[\mathbf{x}_n\mathbf{x}_n^T - + \mathbf{A}'^\text{new} + \mathbf{E}[\mathbf{y}'|\mathbf{x}_n]\mathbf{x}_n^T] +\end{aligned} +\] + +The expectation values used in these updates are given by (Welling's +eq'ns 12 and 13): + +\[ +\begin{aligned} + \mathbf{E}[\mathbf{y}|\mathbf{x}_n] + &= \mathbf{A}^T (\mathbf{A}\mathbf{A}^T + \mathbf{\Sigma})^{-1} + (\mathbf{x}_n - \mathbf{\mu}) \\ + \mathbf{E}[\mathbf{y}\mathbf{y}^T|\mathbf{x}_n] + &= \mathbf{I} - + \mathbf{A}^T (\mathbf{A}\mathbf{A}^T + \mathbf{\Sigma})^{-1} \mathbf{A} + + \mathbf{E}[\mathbf{y}|\mathbf{x}_n] \mathbf{E}[\mathbf{y}|\mathbf{x}_n]^T +\end{aligned} +\] + +Survey analysis +=============== + +Enough abstraction! Let's look at an example: [survey +results][survey]: + + >>> import numpy + >>> scores = numpy.genfromtxt('Factor_analysis/survey.data', delimiter='\t') + >>> scores + array([[ 1., 3., 4., 6., 7., 2., 4., 5.], + [ 2., 3., 4., 3., 4., 6., 7., 6.], + [ 4., 5., 6., 7., 7., 2., 3., 4.], + [ 3., 4., 5., 6., 7., 3., 5., 4.], + [ 2., 5., 5., 5., 6., 2., 4., 5.], + [ 3., 4., 6., 7., 7., 4., 3., 5.], + [ 2., 3., 6., 4., 5., 4., 4., 4.], + [ 1., 3., 4., 5., 6., 3., 3., 4.], + [ 3., 3., 5., 6., 6., 4., 4., 3.], + [ 4., 4., 5., 6., 7., 4., 3., 4.], + [ 2., 3., 6., 7., 5., 4., 4., 4.], + [ 2., 3., 5., 7., 6., 3., 3., 3.]]) + +`scores[i,j]` is the answer the `i`th respondent gave for the `j`th +question. We're looking for underlying factors that can explain +covariance between the different questions. Do the question answers +($\mathbf{x}$) represent some underlying factors ($\mathbf{y}$)? +Let's start off by calculating $\mathbf{\mu}$: + + >>> def print_row(row): + ... print(' '.join('{: 0.2f}'.format(x) for x in row)) + >>> mu = scores.mean(axis=0) + >>> print_row(mu) + 2.42 3.58 5.08 5.75 6.08 3.42 3.92 4.25 + +Next we need priors for $\mathbf{A}$ and $\mathbf{\Sigma}$. [[MDP]] +has an implementation for [[Python]], and their [FANode][] uses a +Gaussian random matrix for $\mathbf{A}$ and the diagonal of the score +covariance for $\mathbf{\Sigma}$. They also use the score covariance +to avoid repeated summations over $n$. + + >>> import mdp + >>> def print_matrix(matrix): + ... for row in matrix: + ... print_row(row) + >>> fa = mdp.nodes.FANode(output_dim=3) + >>> numpy.random.seed(1) # for consistend doctest results + >>> responder_scores = fa(scores) # hidden factors for each responder + >>> print_matrix(responder_scores) + -1.92 -0.45 0.00 + 0.67 1.97 1.96 + 0.70 0.03 -2.00 + 0.29 0.03 -0.60 + -1.02 1.79 -1.43 + 0.82 0.27 -0.23 + -0.07 -0.08 0.82 + -1.38 -0.27 0.48 + 0.79 -1.17 0.50 + 1.59 -0.30 -0.41 + 0.01 -0.48 0.73 + -0.46 -1.34 0.18 + >>> print_row(fa.mu.flat) + 2.42 3.58 5.08 5.75 6.08 3.42 3.92 4.25 + >>> fa.mu.flat == mu # MDP agrees with our earlier calculation + array([ True, True, True, True, True, True, True, True], dtype=bool) + >>> print_matrix(fa.A) # factor weights for each question + 0.80 -0.06 -0.45 + 0.17 0.30 -0.65 + 0.34 -0.13 -0.25 + 0.13 -0.73 -0.64 + 0.02 -0.32 -0.70 + 0.61 0.23 0.86 + 0.08 0.63 0.59 + -0.09 0.67 0.13 + >>> print_row(fa.sigma) # unique noise for each question + 0.04 0.02 0.38 0.55 0.30 0.05 0.48 0.21 + +Because the covariance is unaffected by the +rotation $\mathbf{A}\rightarrow\mathbf{A}\mathbf{R}$, the estimated +weights $\mathbf{A}$ and responder scores $\mathbf{y}$ can be quite +sensitive to the seed priors. The width $\mathbf{\Sigma}$ of the +unique noise $\mathbf{\nu}$ is more robust, because $\mathbf{\Sigma}$ +is unaffected by rotations on $\mathbf{A}$. + +Nomenclature +============ + +
+
$\mathbf{A}_{ij}$
+
The element from the $i^\text{th}$ row and $j^\text{th}$ + column of a matrix $\mathbf{A}$. For example here is a 2-by-3 + matrix terms of components: + +\[ + \mathbf{A} = \begin{pmatrix} + \mathbf{A}_{11} & \mathbf{A}_{12} & \mathbf{A}_{13} \\ + \mathbf{A}_{21} & \mathbf{A}_{22} & \mathbf{A}_{23} + \end{pmatrix} +\] + +
+
$\mathbf{A}^T$
+
The transpose of a matrix (or vector) $\mathbf{A}$. + $\mathbf{A}_{ij}^T=\mathbf{A}_{ji}$
+
$\mathbf{A}^{-1}$
+
The inverse of a matrix $\mathbf{A}$. + $\mathbf{A}^{-1}\dot\mathbf{A}=1$
+
$\text{diag}[\mathbf{A}]$
+
A matrix containing only the diagonal elements of + $\mathbf{A}$, with the off-diagonal values set to zero.
+
$\mathbf{E}[f(\mathbf{x})]$
+
Expectation value for a function $f$ of a random variable + $\mathbf{x}$. If the probability density of $\mathbf{x}$ is + $p(\mathbf{x})$, then $\mathbf{E}[f(\mathbf{x})]=\int d\mathbf{x} + p(\mathbf{x}) f(\mathbf{x})$. For example, + $\mathbf{E}[p(\mathbf{x})]=1$.
+
$\mathbf{\mu}$
+
The mean of a random variable $\mathbf{x}$ is given by + $\mathbf{\mu}=\mathbf{E}[\mathbf{x}]$.
+
$\mathbf{\Sigma}$
+
The covariance of a random variable $\mathbf{x}$ is given by + $\mathbf{\Sigma}=\mathbf{E}[(\mathbf{x}-\mathbf{\mu}) + (\mathbf{x}-\mathbf{\mu})^\mathbf{T}]$. In the factor analysis + model discussed above, $\mathbf{\Sigma}$ is restricted to a + diagonal matrix.
+
$\mathcal{G}_\mathbf{x}[\mu,\mathbf{\Sigma}]$ +
A Gaussian probability density for the random variables + $\mathbf{x}$ with a mean $\mathbf{\mu}$ and a covariance + $\mathbf{\Sigma}$. + +\[ + \mathcal{G}_\mathbf{x}[\mathbf{\mu},\mathbf{\Sigma}] + = \frac{1}{(2\pi)^{\frac{D}{2}}\sqrt{\det[\mathbf{\Sigma}]}} + e^{-\frac{1}{2}(\mathbf{x}-\mathbf{\mu})^T + \mathbf{\Sigma}^{-1} + (\mathbf{x}-\mathbf{\mu})} +\] + +
+
$p(\mathbf{y}|\mathbf{x})$
+
Probability of $\mathbf{y}$ occurring given that $\mathbf{x}$ + occured. This is commonly used in Bayesian + statistics.
+
$p(\mathbf{x}, \mathbf{y})$
+
Probability of $\mathbf{y}$ and $\mathbf{x}$ occuring + simultaneously (the joint density). + $p(\mathbf{x},\mathbf{y})=p(\mathbf{x}|\mathbf{y})p(\mathbf{y})$
+
+ +Note: if you have trouble viewing some of the more obscure [Unicode][] +used in this post, you might want to install the [STIX fonts][STIX]. + +[FA]: http://en.wikipedia.org/wiki/Factor_analysis +[TM]: http://www.unc.edu/~rcm/book/factornew.htm +[MW]: http://www.ics.uci.edu/~welling/classnotes/classnotes.html +[MW-FA]: http://www.ics.uci.edu/~welling/classnotes/papers_class/LinMod.ps.gz +[survey]: http://web.archive.org/web/20051125011642/http://www.ncl.ac.uk/iss/statistics/docs/factoranalysis.html +[EM]: http://www.ics.uci.edu/~welling/classnotes/papers_class/EM.ps.gz +[FANode]: https://github.com/mdp-toolkit/mdp-toolkit/blob/master/mdp/nodes/em_nodes.py +[Unicode]: http://en.wikipedia.org/wiki/Unicode +[STIX]: http://www.stixfonts.org/ + +[[!tag tags/teaching]] +[[!tag tags/theory]] +[[!tag tags/tools]] diff --git a/posts/Factor_analysis/color-ball.py b/posts/Factor_analysis/color-ball.py new file mode 100755 index 0000000..98fd555 --- /dev/null +++ b/posts/Factor_analysis/color-ball.py @@ -0,0 +1,239 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 W. Trevor King +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this program. If not, see +# . + +"""Understanding expectation maximization + +You have a bag of red, green, and blue balls, from which you draw N +times with replacement and get n1 red, n2 green, and n3 blue balls. +The probability of any one combination of n1, n2, and n3 is given by +the multinomial distribution: + + p(n1, n2, n3) = N! / (n1! n2! n3!) p1^n1 p2^n2 p3^n3 + +From some outside information, we can parameterize this model in terms +of a single hidden variable p: + + p1 = 1/4 + p2 = 1/4 + p/4 + p3 = 1/2 - p/4 + +If we are red/green colorblind, we only measure + + m1 = n1 + n2 + m2 = n3 + +What is p (the hidden variable)? What were n1 and n2? +""" + +import numpy as _numpy + + +class BallBag (object): + """Color-blind ball drawings + """ + def __init__(self, p=1): + self._p = p + self.pvals = [0.25, 0.25 + p/4., 0.5 - p/4.] + + def draw(self, n=10): + """Draw `n` balls from the bag with replacement + + Return (m1, m2), where m1 is the number of red or green balls + and m2 is the number of blue balls. + """ + nvals = _numpy.random.multinomial(n=n, pvals=self.pvals) + m1 = sum(nvals[:2]) # red and green + m2 = nvals[2] + return (m1, m2) + + +class Analyzer (object): + def __init__(self, m1, m2): + self.m1 = m1 + self.m2 = m2 + self.p = self.E_n1 = self.E_n2 = None + + def __call__(self): + pass + + def print_results(self): + print('Results for {}:'.format(type(self).__name__)) + for name,attr in [ + ('p', 'p'), + ('E[n1|m1,m2]', 'E_n1'), + ('E[n2|m1,m2]', 'E_n2'), + ]: + print(' {}: {}'.format(name, getattr(self, attr))) + + +class Naive (Analyzer): + """Simple analysis + + With a large enough sample, the measured m1 and m2 give good + estimates for (p1 + p2) and p3. You can use either of these to + solve for the unknown p, and then solve for E[n1] and E[n2]. + + While this is an easy approach for the colored ball example, it + doesn't generalize well to more complicated models ;). + """ + def __call__(self): + N = self.m1 + self.m2 + p1 = 0.25 + p3 = self.m2 / float(N) + p2 = 1 - p1 - p3 + self.p = 4*p2 - 1 + self.E_n1 = p1 * N + self.E_n2 = p2 * N + + +class MaximumLikelihood (Analyzer): + """Analytical ML estimation + + The likelihood of a general model θ looks like: + + L(x^N,θ) = sum_{n=1}^N log[p(x_n|θ)] + log[p(θ)] + + dropping the p(θ) term and applying to this situation, we have: + + L([m1,m2], p) = N! / (m1! m2!) (p1 + p2)^m1 p3^m2 + = N! / (m1! m2!) (1/2 + p/4)^m1 (1/2 - p/4)^m2 + + which comes from recognizing that to a color-blind experimenter the + three ball colors are effectively two ball colors, so they'll have a + binomial distribution. Maximizing the log-likelihood: + + log[L(m1,m2)] = log[N!…] + m1 log[1/2 + p/4] + m2 log[1/2 - p/4] + d/dp log[L] = m1/(1/2 + p/4)/4 + m2/(1/2 - p/4)/(-4) = 0 + m1 (2 - p) = m2 (2 + p) + 2 m1 - m1 p = 2 m2 + m2 p + (m1 + m2) p = 2 (m1 - m2) + p = 2 (m1 - m2) / (m1 + m2) + + Given this value of p, the the expected values of n1 and n2 are: + + E[n1|m1,m2] = p1 / (p1 + p2) * m1 # from the relative probabilities + = (1/4) / (1/2 + p/4) * m1 + = m1 / (2 + p) + = m1 / [2 + 2 (m1 - m2) / (m1 + m2)] + = m1/2 * (m1 + m2) / (m1 + m2 + m1 - m2) + = m1 * (m1 + m2) / (4 m1) + = (m1 + m2) / 4 + E[n2|m1,m2] = p2 / (p1 + p2) * m1 + = (1/4 + p/4) / (1/2 + p/4) * m1 + = m1 (1 + p) / (2 + p) + = m1 [1 + 2 ((m1 - m2) / (m1 + m2)] / + [2 + 2 (m1 - m2) / (m1 + m2)] + = m1/2 * (m1 + m2 + 2m1 - 2m2) / (m1 + m2 + m1 - m2) + = m1 * (3m1 - m2) / (4 m1) + = (3m1 - m2) / 4 + + So with a draw of m1 = 61 and m2 = 39, the ML estimates are: + + p = 0.44 + E[n1|m1,m2] = 25.0 + E[n2|m1,m2] = 36.0 + """ + def __call__(self): + N = self.m1 + self.m2 + self.p = 2 * (self.m1 - self.m2) / float(N) + self.E_n1 = N / 4. + self.E_n2 = (3*self.m1 - self.m2) / 4. + + +class ExpectationMaximizer (Analyzer): + """Expectation maximization + + Sometimes analytical ML is hard, so instead we iteratively + optimize: + + Q(θ_t|θ_{t-1}) = E[log[p(x,y,θ_t)]|x,θ_{t-1}] + + Applying to this situation, we have: + + Q(p_t|p_{t-1}) = E[log[p([m1,m2],[n1,n2,n3],p_t)]|[m1,m2],p_{t-1}] + + where: + + p(m1,m2,n1,n2,n3,p) = δ(m1-n1-n2)δ(m2-n3)p(n1,n2,n3) + + Plugging in and expanding the log: + + Q(p_t|p_{t-1}) + = E[log[δ(m1…)] + log[δ(m2…)] + log[p(n1,n2,n3,p_t)] + |m1,m2,p_{t-1}] + ≈ E[log[p(n1,n2,n3,p_t)]|m1,m2,p_{t-1}] # drop boring δ terms + ≈ E[log[N!…] + n1 log[1/4] + n2 log[1/4 + p_t/4] + n3 log[1/2 - p_t/4] + |m1,m2,p_{t-1}] + ≈ E[n2 log[1/4 + p_t/4] + n3 log[1/2 - p_t/4] + |m1,m2,p_{t-1}] # drop non-p_t terms + ≈ E[n2|m1,m2,p_{t-1}] log[1/4 + p_t/4] + m2 log[1/2 - p_t/4] + + Maximizing (the M step): + + d/dp_t Q(p_t|p_{t-1}) + ≈ E[n2|m1,m2,p_{t-1}] / (1/4 + p_t/4)/4 + m2 / (1/2 - p_t/4)/(-4) + = 0 + E[n2|m1,m2,p_{t-1}] / (1 + p_t) = m2 / (2 - p_t) + E[n2|m1,m2,p_{t-1}] (2 - p_t) = m2 (1 + p_t) + p_t (E[n2|m1,m2,p_{t-1}] + m2) = 2 E[n2|m1,m2,p_{t-1}] - m2 + p_t = (2 E[n2|m1,m2,p_{t-1}] - m2) / (E[n2|m1,m2,p_{t-1}] + m2) + + To get a value for p_t, we need to evaluate those expectations + (the E step). Using a subset of the ML analysis: + + E[n2|m1,m2,p_{t-1}] = m1 (1 + p_{t-1}) / (2 + p_{t-1}) + """ + def __init__(self, p=0, **kwargs): + super(ExpectationMaximizer, self).__init__(**kwargs) + self.p = 0 # prior belief + + def _E_step(self): + """Caculate E[ni|m1,m2,p_{t-1}] given the prior parameter p_{t-1} + """ + return { + 'E_n1': m1 / (2. + self.p), + 'E_n2': m1 * (1. + self.p) / (2. + self.p), + 'E_n3': m2, + } + + def _M_step(self, E_n1, E_n2, E_n3): + "Maximize Q(p_t|p_{t-1}) over p_t" + self.p = (2.*E_n2 - self.m2) / (E_n2 + self.m2) + + def __call__(self, n=10): + for i in range(n): + print(' estimated p{}: {}'.format(i, self.p)) + Es = self._E_step() + self._M_step(**Es) + for key,value in self._E_step().items(): + setattr(self, key, value) + + +if __name__ == '__main__': + p = 0.6 + bag = BallBag(p=p) + m1,m2 = bag.draw(n=100) + print('estimate p using m1 = {} and m2 = {}'.format(m1, m2)) + for analyzer in [ + ExpectationMaximizer(m1=m1, m2=m2), + MaximumLikelihood(m1=m1, m2=m2), + Naive(m1=m1, m2=m2), + ]: + analyzer() + analyzer.print_results() diff --git a/posts/Factor_analysis/factors.dia b/posts/Factor_analysis/factors.dia new file mode 100644 index 0000000..78973e9 --- /dev/null +++ b/posts/Factor_analysis/factors.dia @@ -0,0 +1,1444 @@ + + + + + + + + + + + + + #A4# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #Common factors (y)# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #Specific factors (μ) # + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #Measurement error factors (ν)# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #Unique factors (μ + ν)# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #Surface attributes (x)# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #Factor weights (A)# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #Addition (+) ;)# + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/posts/Factor_analysis/factors.png b/posts/Factor_analysis/factors.png new file mode 100644 index 0000000000000000000000000000000000000000..fb7ab111d35ff599f954e0b5eadf655465900981 GIT binary patch literal 28824 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 SS`i#Ii0B?Q)GE>-h5aAw2Eq>j literal 0 HcmV?d00001 diff --git a/posts/Factor_analysis/survey.data b/posts/Factor_analysis/survey.data new file mode 100644 index 0000000..51fbb7a --- /dev/null +++ b/posts/Factor_analysis/survey.data @@ -0,0 +1,15 @@ +#cost quality availability quantity respectability prestige experience popularity +# 1 = not important, 7 = very important +# http://web.archive.org/web/20051125011642/http://www.ncl.ac.uk/iss/statistics/docs/factoranalysis.html +1 3 4 6 7 2 4 5 +2 3 4 3 4 6 7 6 +4 5 6 7 7 2 3 4 +3 4 5 6 7 3 5 4 +2 5 5 5 6 2 4 5 +3 4 6 7 7 4 3 5 +2 3 6 4 5 4 4 4 +1 3 4 5 6 3 3 4 +3 3 5 6 6 4 4 3 +4 4 5 6 7 4 3 4 +2 3 6 7 5 4 4 4 +2 3 5 7 6 3 3 3 -- 2.26.2