The hardware and bandwidth for this mirror is donated by dogado GmbH, the Webhosting and Full Service-Cloud Provider. Check out our Wordpress Tutorial.
If you wish to report a bug, or if you are interested in having us mirror your free-software or open-source project, please feel free to contact us at mirror[@]dogado.de.

Principal component analysis: breast tumours

One of the case studies of the Analyse de données (L3 Informatique) course, for which fdm2id was written. How many factorial axes a dataset really needs, how to read them, and what a supplementary variable is for.

The other case studies are listed by vignette (package = "fdm2id"); they use the same handful of functions on other data, and can be read in any order.

library (fdm2id)

The data

A database on breast cancer, built in 1992 by Dr W. H. Wolberg at the University of Wisconsin. Of the 699 patients, 458 carried a benign tumour and 241 a malignant one. Each tumour is described by nine criteria (size, shape of the cells, and so on), each graded from 1 to 10.

Sixteen records have a missing value, all of them on Bare.nuclei. Rather than dropping those patients, the value is predicted from the eight other criteria and rounded back to the 1–10 scale – a regression used as an imputation, which is the first thing the package’s LINREG is good for here.

library (mlbench)
data (BreastCancer)
BreastCancer = BreastCancer [, -1]
BreastCancer [, -10] = lapply (BreastCancer [, -10], function (x) as.numeric (as.character (x)))
names (which (colSums (is.na (BreastCancer)) > 0))
#> [1] "Bare.nuclei"
train = BreastCancer [!is.na (BreastCancer$Bare.nuclei), ]
BreastCancer [is.na (BreastCancer$Bare.nuclei), 6] =
  round (predict (LINREG (train [, -c (6, 10)], train [, 6]),
                  BreastCancer [is.na (BreastCancer$Bare.nuclei), -6]))
summary (BreastCancer)
#>   Cl.thickness      Cell.size        Cell.shape     Marg.adhesion   
#>  Min.   : 1.000   Min.   : 1.000   Min.   : 1.000   Min.   : 1.000  
#>  1st Qu.: 2.000   1st Qu.: 1.000   1st Qu.: 1.000   1st Qu.: 1.000  
#>  Median : 4.000   Median : 1.000   Median : 1.000   Median : 1.000  
#>  Mean   : 4.418   Mean   : 3.134   Mean   : 3.207   Mean   : 2.807  
#>  3rd Qu.: 6.000   3rd Qu.: 5.000   3rd Qu.: 5.000   3rd Qu.: 4.000  
#>  Max.   :10.000   Max.   :10.000   Max.   :10.000   Max.   :10.000  
#>   Epith.c.size     Bare.nuclei      Bl.cromatin     Normal.nucleoli 
#>  Min.   : 1.000   Min.   : 1.000   Min.   : 1.000   Min.   : 1.000  
#>  1st Qu.: 2.000   1st Qu.: 1.000   1st Qu.: 2.000   1st Qu.: 1.000  
#>  Median : 2.000   Median : 1.000   Median : 3.000   Median : 1.000  
#>  Mean   : 3.216   Mean   : 3.528   Mean   : 3.438   Mean   : 2.867  
#>  3rd Qu.: 4.000   3rd Qu.: 6.000   3rd Qu.: 5.000   3rd Qu.: 4.000  
#>  Max.   :10.000   Max.   :10.000   Max.   :10.000   Max.   :10.000  
#>     Mitoses             Class    
#>  Min.   : 1.000   benign   :458  
#>  1st Qu.: 1.000   malignant:241  
#>  Median : 1.000                  
#>  Mean   : 1.589                  
#>  3rd Qu.: 1.000                  
#>  Max.   :10.000
plotdata (BreastCancer)

Question 1. How many factorial axes are needed?

pca = PCA (BreastCancer, quali.sup = 10, scale.unit = TRUE)
kaiser (pca)
#> [1] 1
plot (pca, type = "eig")

Answer. Both Kaiser’s rule and the elbow of the scree plot say that a single factorial axis is enough. It carries 65.6% of the variance on its own, the second one 8.6%.

Question 2. How should the first two axes be read?

plot (pca, type = "cor")

Answer. On the correlation circle, every variable is strongly tied to the first axis. The second one depends mainly on Mitoses – the only variable whose coordinate on it is large.

round (pca$var$coord [, 1:2], 2)
#>                 Dim.1 Dim.2
#> Cl.thickness     0.73 -0.13
#> Cell.size        0.93 -0.04
#> Cell.shape       0.92 -0.07
#> Marg.adhesion    0.81 -0.04
#> Epith.c.size     0.82  0.15
#> Bare.nuclei      0.82 -0.22
#> Bl.cromatin      0.84 -0.20
#> Normal.nucleoli  0.82  0.02
#> Mitoses          0.56  0.80

Question 3. What can be said about the two groups of tumours?

The class was declared as a supplementary variable, so it played no part in building the axes. Nothing stops us from colouring the individuals by it afterwards – that is the whole point of declaring it supplementary.

plotdata (pca$ind$coord [, 1:2], BreastCancer [, 10], type = "scatter")

Answer. The benign tumours form a very homogeneous group, the malignant ones a much more scattered one. The position on the first principal axis is related to the type of the tumour: the higher the value, the more likely the tumour is malignant.

round (tapply (pca$ind$coord [, 1], BreastCancer [, 10], mean), 2)
#>    benign malignant 
#>     -1.57      2.99
round (tapply (pca$ind$coord [, 1], BreastCancer [, 10], sd), 2)
#>    benign malignant 
#>      0.69      1.60

The two means are far apart, and the standard deviation of the malignant group is more than twice that of the benign one.

These binaries (installable software) and packages are in development.
They may not be fully stable and should be used with caution. We make no claims about them.
Health stats visible at Monitor.