PCA (Principal Component Analysis)

A Análise de Componentes Principais é indicada quando possuímos um conjunto de variáveis contínuas muito amplo. Após a análise, cada componente principal representa uma combinação linear das variáveis originais inseridas na matriz dados.

Os componentes principais agrupam elementos que variam num mesmo sentido, o que facilita a compreensão de como as variáveis interagem entre si. Eles têm a vantagem de serem independentes, podendo ser utilizados em testes de regressão linear, por exemplo.

Nós usaremos os dados de variáveis químicas de sedimento amostradas em 24 locais para exemplificar a construção de uma PCA. O conjunto de dados se encontra no arquivo varechem.csv.

# setwd("C:/Users/Fábio Barros/Desktop/CursoR")

# Para construir a PCA devemos definir que a primeira coluna
# do conjunto de dados referem-se aos nomes. 
# Portanto, pedimos para abrir o arquivo com o comando row.names=1
solo <- read.csv("http://renatabrandt.github.io/EBC2015/data/varechem.csv", row.names=1)
is.data.frame(solo)
## [1] TRUE

Usando PRCOMP

Neste tópico, nós usaremos o pacote vegan - function prcomp - para construir a PCA. Existem dois tipos de PCA: a PCA de covariância e a PCA de correlação. Quando as variáveis foram medidas em unidades diferentes ou quando a variância de cada variável é muito diferente umas das outras devemos usar a PCA de correlação, que é construida usando os dados que foram padronizados para ter média 0 e desvio padrão 1.

Geralmente é exatamente esta situação que encontramos lidando com problemas biológicos!!!

Vamos observar as variâncias dos dados químicos do arquivo varechem?

round(apply(solo,2,var),2) 
##        N        P        K       Ca       Mg        S       Al       Fe 
##    30.56   223.39  4204.53 59332.17  1681.93   136.14 14962.28  3654.07 
##       Mn       Zn       Mo Baresoil Humdepth       pH 
##  1149.98     8.90     0.06   270.26     0.44     0.05

Veja que a variância de cada variável é muito diferente. Portanto, temos que usar uma PCA de correlação para que a variável com maior variância não “domine” a análise.

Para construir a PCA de correlação usando prcomp devemos usar o argumento scale=T. Vamos agora rodar a análise no conjunto de dados solo?

install.packages(“vegan”)

require(vegan)
## Loading required package: vegan
## Warning: package 'vegan' was built under R version 3.1.3
## Loading required package: permute
## Warning: package 'permute' was built under R version 3.1.3
## Loading required package: lattice
## Warning: package 'lattice' was built under R version 3.1.3
## This is vegan 2.3-0
# para "rodar" a análise e visualizar a contribuição de
# cada variável no componente
prc.solo <- prcomp(solo, scale=TRUE); prc.solo
## Standard deviations:
##  [1] 2.2784976 1.7868529 1.2982707 1.0339221 0.9033240 0.8401250 0.6606103
##  [8] 0.6073232 0.4132034 0.3866882 0.2919936 0.2643011 0.1872348 0.1536722
## 
## Rotation:
##                  PC1         PC2         PC3         PC4          PC5
## N         0.09462709  0.12435859 -0.16204826 -0.79318367  0.351576656
## P        -0.35589258 -0.20731069  0.09086948 -0.08242977 -0.219919629
## K        -0.36318854 -0.16172669 -0.04259682 -0.21401371 -0.176886144
## Ca       -0.35975485 -0.08457237  0.32644437  0.01826328  0.236121676
## Mg       -0.35228219 -0.09776116  0.08467641  0.03784222  0.486392688
## S        -0.33246862 -0.29668916 -0.21512714  0.01410909 -0.070039686
## Al        0.11552207 -0.48048232 -0.26540100 -0.07767669 -0.005266422
## Fe        0.20299687 -0.38301396 -0.15691339 -0.31769008  0.022858769
## Mn       -0.28756460  0.19318776  0.08921960 -0.37885343 -0.489948050
## Zn       -0.34603172 -0.16198093  0.04178581  0.05229606  0.150267479
## Mo       -0.04154531 -0.22863241 -0.58319905  0.23286801  0.029395588
## Baresoil -0.16349721  0.31570370 -0.27274616  0.06312303  0.407367062
## Humdepth -0.23531857  0.33736134 -0.28352933 -0.02541797  0.046678588
## pH        0.16613845 -0.32216601  0.45164891 -0.06492250  0.259486172
##                  PC6          PC7          PC8          PC9        PC10
## N         0.31876043 -0.020445294  0.106079920 -0.029711941  0.25325314
## P         0.08346185 -0.202993610 -0.291937970  0.529497898  0.48691417
## K        -0.30156737 -0.083967201  0.345810459 -0.347935071  0.19105757
## Ca       -0.10026235 -0.056467690 -0.241640431 -0.132902952  0.15581868
## Mg       -0.11335320  0.422483826  0.002896128  0.185900569 -0.18858761
## S        -0.09229889 -0.001743922  0.271322793 -0.041707742 -0.01394397
## Al       -0.20467312 -0.090888045 -0.037652261 -0.325530088 -0.02736515
## Fe       -0.33950608  0.197580497 -0.192886023  0.424437201 -0.32652805
## Mn        0.07123733 -0.136543653 -0.274959999 -0.080205160 -0.54341919
## Zn        0.54306692  0.032492006  0.238361969 -0.005992104 -0.36679941
## Mo        0.41761742 -0.120157357 -0.352212047 -0.082184113  0.02092970
## Baresoil -0.32655495 -0.662017409 -0.006567573  0.150678212 -0.20591182
## Humdepth -0.16741045  0.425702015 -0.465061249 -0.315633320  0.12595591
## pH        0.05330910 -0.262135909 -0.374832351 -0.349371603 -0.07947962
##                  PC11        PC12        PC13         PC14
## N        -0.005103292  0.03375847  0.12866179 -0.023577121
## P        -0.212772662 -0.15369608 -0.16014570 -0.146803748
## K         0.118589614  0.28135388 -0.50806589  0.191151759
## Ca        0.669374213 -0.03834446  0.36929697  0.035843646
## Mg       -0.239307771  0.42332112 -0.05980040 -0.345891242
## S        -0.378600375 -0.07818118  0.63006839  0.345755661
## Al        0.018994101 -0.30010097  0.04257464 -0.654805487
## Fe        0.238879497 -0.09798831 -0.12533928  0.354078026
## Mn       -0.035024496  0.18554028  0.13661147 -0.181857434
## Zn        0.104956310 -0.48566331 -0.29628189  0.070169749
## Mo        0.159957373  0.43567172 -0.03761246  0.117855258
## Baresoil -0.053374989 -0.10187147 -0.07709019  0.007445089
## Humdepth -0.168085863 -0.37001287 -0.13026298  0.156358945
## pH       -0.406958380  0.04733921 -0.12013250  0.265236656
# para acessar a estrutura do elemento "prc.solo"
str(prc.solo)
## List of 5
##  $ sdev    : num [1:14] 2.278 1.787 1.298 1.034 0.903 ...
##  $ rotation: num [1:14, 1:14] 0.0946 -0.3559 -0.3632 -0.3598 -0.3523 ...
##   ..- attr(*, "dimnames")=List of 2
##   .. ..$ : chr [1:14] "N" "P" "K" "Ca" ...
##   .. ..$ : chr [1:14] "PC1" "PC2" "PC3" "PC4" ...
##  $ center  : Named num [1:14] 22.4 45.1 162.9 569.7 87.5 ...
##   ..- attr(*, "names")= chr [1:14] "N" "P" "K" "Ca" ...
##  $ scale   : Named num [1:14] 5.53 14.95 64.84 243.58 41.01 ...
##   ..- attr(*, "names")= chr [1:14] "N" "P" "K" "Ca" ...
##  $ x       : num [1:24, 1:14] 1.539 4.255 -0.689 3.634 3.373 ...
##   ..- attr(*, "dimnames")=List of 2
##   .. ..$ : chr [1:24] "local01" "local02" "local03" "local04" ...
##   .. ..$ : chr [1:14] "PC1" "PC2" "PC3" "PC4" ...
##  - attr(*, "class")= chr "prcomp"
# para visualizar o número de componentes e as respectivas
# contribuições para a variância total.
screeplot(prc.solo)

# para mostrar a porcentagem de variância capturada por cada eixo
summary(prc.solo)
## Importance of components:
##                           PC1    PC2    PC3     PC4     PC5     PC6
## Standard deviation     2.2785 1.7869 1.2983 1.03392 0.90332 0.84013
## Proportion of Variance 0.3708 0.2281 0.1204 0.07636 0.05829 0.05042
## Cumulative Proportion  0.3708 0.5989 0.7193 0.79564 0.85392 0.90434
##                            PC7     PC8    PC9    PC10    PC11    PC12
## Standard deviation     0.66061 0.60732 0.4132 0.38669 0.29199 0.26430
## Proportion of Variance 0.03117 0.02635 0.0122 0.01068 0.00609 0.00499
## Cumulative Proportion  0.93551 0.96185 0.9740 0.98473 0.99082 0.99581
##                          PC13    PC14
## Standard deviation     0.1872 0.15367
## Proportion of Variance 0.0025 0.00169
## Cumulative Proportion  0.9983 1.00000
# para fazer o plot da PCA
biplot(prc.solo)

# para acessar os escores da PCA
prc.solo$x
##                 PC1         PC2          PC3         PC4          PC5
## local01  1.53878447 -2.46012329 -0.294009378 -0.85232874 -0.817340772
## local02  4.25544857 -1.67410775 -0.504746514 -1.63909051  0.558770476
## local03 -0.68902667 -3.34189696 -2.563741690  0.71125297 -0.968989199
## local04  3.63433625  1.21449816  1.339689070 -0.83264806  0.499185602
## local05  3.37347840  0.07290487 -0.358467072  1.02764414 -0.555584417
## local06  3.88231709 -0.44736574 -0.728450291 -1.01917052  0.786719915
## local07  0.08438668 -1.40485249 -0.514479851  1.58312456 -0.733411043
## local08 -0.85106814 -1.93158072  2.455295189  0.60099298 -0.837723132
## local09 -0.25592697 -3.08135124  3.665611461  0.10586883  1.117079105
## local10  1.23674421  0.53360601  0.271442076  1.49529509 -0.586950936
## local11 -1.61179969 -1.72776197 -1.851617499 -1.61763757  0.161168189
## local12 -0.10849087  1.23231788 -1.057894796  0.85576997  0.235369165
## local13  0.52756644  0.75652573  0.004377408  1.24113026 -1.202410202
## local14  1.61990524  1.54627261 -0.182700904  0.30489556 -0.009249015
## local15  0.13222328  1.70101442 -0.279475522  0.47325693 -0.103821307
## local16 -1.96510029  1.49265376 -1.119483753  0.37139226  1.332867226
## local17 -2.41827770  0.41983066 -1.013756555 -0.72805394  0.288590298
## local18  1.26576946  2.38382268  0.297393354  0.86387385  1.282661605
## local19 -0.78264065  1.74589273  0.277038549 -0.64096723  0.079834902
## local20 -1.83673667  1.74473867 -0.298946184  0.06989374  0.804034232
## local21 -3.96343087 -2.54549515 -0.017887116  1.01474228  1.896445495
## local22 -0.88868934  1.82326518  1.044623907 -0.75063513 -1.242461532
## local23 -3.24105345  1.03869050  1.093443151 -0.74721229 -1.122790249
## local24 -2.93871880  0.90850144  0.336742959 -1.89138943 -0.861994408
##                 PC6          PC7         PC8         PC9        PC10
## local01 -0.72299099  0.764129828  0.52251461  0.87005247 -0.21039984
## local02 -0.18623480  0.473990937 -1.15101958  0.18069717  0.01462754
## local03  0.43945828 -1.092945035 -0.43319856 -0.16366937  0.32388296
## local04  2.33214424 -0.372775208  1.06173977  0.03575899 -0.10222536
## local05  0.44585427  0.437849242 -0.66318161 -0.02922027 -0.12788259
## local06 -0.24475511  0.003896015 -0.07322921 -0.07022198  0.03076471
## local07  0.78911410  0.313163663 -0.40901417 -0.38867009  0.02167642
## local08 -0.46303287 -0.259576328  0.80876134  0.14111906  0.27398425
## local09 -1.05247280 -0.473633258 -0.53811517 -0.46308153  0.16295082
## local10  0.06898806  0.473997752  0.13222574 -0.44070463  0.20907903
## local11 -0.99674051  0.028618132  1.41746150 -0.78794716 -0.41248879
## local12  0.24258363  0.117482816  0.34746586 -0.11334200  0.29864105
## local13 -0.87748856  0.140335713  0.35570552  0.18415914 -0.32702920
## local14 -0.02669483 -0.373476941  0.78419427 -0.06115766  0.48740293
## local15 -0.97013110 -0.412107828  0.10430066  0.89379861 -0.19515377
## local16 -0.59222144  1.238669139 -0.34158207 -0.31889053 -0.05364217
## local17  0.31608364 -1.808311684 -0.48521666  0.13191310 -0.29763388
## local18 -0.81765547 -0.902502014 -0.12769610 -0.14410013 -0.32436679
## local19  0.23366653  0.539332177 -0.05889938 -0.51844860  0.03006888
## local20 -0.76167251  0.030023854 -0.13218763  0.51649591  0.70693203
## local21  1.65855241  0.584842783  0.19856484  0.59859756 -0.34214482
## local22  0.45818828 -0.296177146 -0.70116183 -0.08870626 -0.56597254
## local23  0.14867036  0.577453010 -0.34781468 -0.05752049 -0.59425418
## local24  0.57878720  0.267720379 -0.27061746  0.09308865  0.99318331
##                PC11         PC12         PC13        PC14
## local01  0.45544416 -0.635306833  0.038260431  0.10380174
## local02 -0.33603215  0.155223171 -0.036095816  0.23450059
## local03  0.31092450 -0.016558671 -0.232369489 -0.25165355
## local04  0.04588475 -0.150519119 -0.068070865 -0.09223078
## local05  0.20774098  0.368308444 -0.078853433  0.10186206
## local06 -0.32299944  0.093391136  0.116566189 -0.41080566
## local07 -0.40521219 -0.212953448  0.379813850  0.05207296
## local08 -0.67108522 -0.072769123  0.132399959 -0.03854731
## local09  0.47248237  0.001778163 -0.044201689 -0.01970105
## local10  0.10370214  0.071014379  0.041195274  0.05293037
## local11 -0.06593851  0.293911543  0.019257591  0.08668395
## local12  0.21053275 -0.319591277 -0.001286276  0.11266438
## local13 -0.26463780  0.216772715 -0.264956749  0.10969811
## local14  0.23745992  0.059594599 -0.068810220  0.04176308
## local15  0.15181987  0.446288151  0.180710086 -0.14511706
## local16 -0.16861193 -0.476514833 -0.109832641 -0.17267154
## local17 -0.11048490 -0.198738243  0.218426950  0.21618583
## local18 -0.19983373 -0.218125923 -0.320691780  0.11931958
## local19  0.45835909  0.245481007  0.344342190  0.09944716
## local20  0.03233029  0.054332723  0.215246883 -0.07599179
## local21 -0.03469025  0.310027914 -0.084404758  0.05320728
## local22  0.03863706 -0.175523779  0.079312882 -0.09860196
## local23  0.07314193  0.063378029 -0.169590445 -0.18408979
## local24 -0.21893369  0.097099274 -0.286368123  0.10527341

Como observamos nas linhas de comando, o resultado da PCA retém escores referentes a cada PC. Os escores são as variáveis independentes que podem ser utilizadas em outras análises, como numa regressão linear.

Usando PRINCIPAL

Nós preferimos usar o pacote psych - function principal que nos dá uma série de opções como, por exemplo, rotacionar o eixo dos componentes. Além disso, achamos o default do pacote mais interessante.

A PCA pelo pacote psych requer que seja determinado previamente o número de componentes que serão retidos. Nós podemos usar a função fa.parallel para isto.

install.packages(“psych”)

require(psych)
## Loading required package: psych
## Warning: package 'psych' was built under R version 3.1.3
fa.parallel (solo, fa="pc", show.legend=T,
             main="Scree plot with parallel analysis")

## Parallel analysis suggests that the number of factors =  NA  and the number of components =  2
# A análise realizada acima sugere 02 componentes. 
# É possivel ainda estabeler outro critério de "corte" como por exemplo autovalores (eigenvalue) acima de 1.

Vamos agora rodar a PCA?

pca.solo <- principal(solo, nfactors=2, n.obs=24,
                      rotate='none', scores=TRUE)

# Se existirem mais de 02 PCs podemos aplicar a rotação nos eixos
# É carregar o pacote "GPArotation" e mudar o argumento para 
# rotate="varimax", por exemplo.

# A função PRINCIPAL executa uma PCA de correlação como análise padrão.
str(pca.solo)
## List of 28
##  $ values      : num [1:14] 5.192 3.193 1.686 1.069 0.816 ...
##  $ rotation    : chr "none"
##  $ n.obs       : int 24
##  $ communality : Named num [1:14] 0.0959 0.7948 0.7683 0.6947 0.6748 ...
##   ..- attr(*, "names")= chr [1:14] "N" "P" "K" "Ca" ...
##  $ loadings    : loadings [1:14, 1:2] -0.216 0.811 0.828 0.82 0.803 ...
##   ..- attr(*, "dimnames")=List of 2
##   .. ..$ : chr [1:14] "N" "P" "K" "Ca" ...
##   .. ..$ : chr [1:2] "PC1" "PC2"
##  $ fit         : num 0.87
##  $ fit.off     : num 0.909
##  $ fn          : chr "principal"
##  $ Call        : language principal(r = solo, nfactors = 2, rotate = "none", n.obs = 24, scores = TRUE)
##  $ uniquenesses: Named num [1:14] 0.904 0.205 0.232 0.305 0.325 ...
##   ..- attr(*, "names")= chr [1:14] "N" "P" "K" "Ca" ...
##  $ complexity  : Named num [1:14] 2 1.4 1.24 1.07 1.09 ...
##   ..- attr(*, "names")= chr [1:14] "N" "P" "K" "Ca" ...
##  $ chi         : num 62.5
##  $ EPVAL       : num 0.529
##  $ R2          : Named num [1:2] 1 1
##   ..- attr(*, "names")= chr [1:2] "PC1" "PC2"
##  $ objective   : num 7.24
##  $ residual    : num [1:14, 1:14] 0.90414 0.00599 0.096 -0.06058 0.04811 ...
##   ..- attr(*, "dimnames")=List of 2
##   .. ..$ : chr [1:14] "N" "P" "K" "Ca" ...
##   .. ..$ : chr [1:14] "N" "P" "K" "Ca" ...
##  $ rms         : num 0.12
##  $ factors     : int 2
##  $ dof         : num 64
##  $ null.dof    : num 91
##  $ null.model  : num 14.9
##  $ criteria    : Named num [1:3] 7.24 NA NA
##   ..- attr(*, "names")= chr [1:3] "objective" "" ""
##  $ STATISTIC   : num 117
##  $ PVAL        : num 5.94e-05
##  $ weights     : num [1:14, 1:2] -0.0415 0.1562 0.1594 0.1579 0.1546 ...
##   ..- attr(*, "dimnames")=List of 2
##   .. ..$ : chr [1:14] "N" "P" "K" "Ca" ...
##   .. ..$ : chr [1:2] "PC1" "PC2"
##  $ r.scores    : num [1:2, 1:2] 1.00 -1.70e-15 -1.66e-15 1.00
##   ..- attr(*, "dimnames")=List of 2
##   .. ..$ : chr [1:2] "PC1" "PC2"
##   .. ..$ : chr [1:2] "PC1" "PC2"
##  $ Structure   : loadings [1:14, 1:2] -0.216 0.811 0.828 0.82 0.803 ...
##   ..- attr(*, "dimnames")=List of 2
##   .. ..$ : chr [1:14] "N" "P" "K" "Ca" ...
##   .. ..$ : chr [1:2] "PC1" "PC2"
##  $ scores      : num [1:24, 1:2] -0.675 -1.868 0.302 -1.595 -1.481 ...
##   ..- attr(*, "dimnames")=List of 2
##   .. ..$ : chr [1:24] "local01" "local02" "local03" "local04" ...
##   .. ..$ : chr [1:2] "PC1" "PC2"
##  - attr(*, "class")= chr [1:2] "psych" "principal"
# para acessar os eingenvalues
pca.solo$values
##  [1] 5.19155128 3.19284315 1.68550672 1.06899485 0.81599434 0.70581009
##  [7] 0.43640596 0.36884148 0.17073705 0.14952776 0.08526025 0.06985507
## [13] 0.03505687 0.02361514
# para visualisar a contribuição de cada variável (peso)
pca.solo$loadings
## 
## Loadings:
##          PC1    PC2   
## N        -0.216 -0.222
## P         0.811  0.370
## K         0.828  0.289
## Ca        0.820  0.151
## Mg        0.803  0.175
## S         0.758  0.530
## Al       -0.263  0.859
## Fe       -0.463  0.684
## Mn        0.655 -0.345
## Zn        0.788  0.289
## Mo               0.409
## Baresoil  0.373 -0.564
## Humdepth  0.536 -0.603
## pH       -0.379  0.576
## 
##                  PC1   PC2
## SS loadings    5.192 3.193
## Proportion Var 0.371 0.228
## Cumulative Var 0.371 0.599
# para acessar os escores da PCA
pca.solo$scores
##                 PC1         PC2
## local01 -0.67535049  1.37679120
## local02 -1.86765551  0.93690297
## local03  0.30240395  1.87026981
## local04 -1.59505819 -0.67968560
## local05 -1.48057141 -0.04080071
## local06 -1.70389344  0.25036518
## local07 -0.03703611  0.78621610
## local08  0.37352163  1.08099596
## local09  0.11232269  1.72445717
## local10 -0.54278934 -0.29862896
## local11  0.70739583  0.96693019
## local12  0.04761509 -0.68965829
## local13 -0.23154137 -0.42338446
## local14 -0.71095324 -0.86536091
## local15 -0.05803091 -0.95196111
## local16  0.86245441 -0.83535348
## local17  1.06134749 -0.23495536
## local18 -0.55552811 -1.33409008
## local19  0.34348978 -0.97707694
## local20  0.80611745 -0.97643108
## local21  1.73949311  1.42456897
## local22  0.39003304 -1.02037790
## local23  1.42245200 -0.58129604
## local24  1.28976164 -0.50843662
# para salvar os escores como um conjunto de dados
SCORES<-data.frame(pca.solo$scores)

# para plotar o gráfico
biplot (pca.solo)

Visualizando os loadings dos componentes

De modo a facilitar o entendimento de qual variável contínua contribui com maior peso em cada PC mostraremos um exemplo de construção gráfica para os loadings por meio do pacote lattice.

install.packages(lattice)

require(lattice)

# definimos os loadings como objeto
load <- pca.solo$loadings

sorted.loadings1 <- load[order(load[,1]),1]
# definimos o objeto que descreve o peso das variáveis para o PC1
Main = "Loadings Plot for PC1"; xlabs = "Variable Loadings"
# criamos objetos que descrevem o título e o eixo x da figura
load1 <- dotplot(sorted.loadings1, main=Main,
                  xlab=xlabs, cex=1.5, col="red", pch=16)
# para plotar um gráfico simples de pontos
load1

Quais as variáveis que mais contribuem no PC1? Vamos plotar os gráficos para os loadings referentes ao PC2?

sorted.loadings2 <- load[order(load[,2]),2]
Main="Loadings Plot for PC2"; xlabs="Variable Loadings"
load2<-dotplot(sorted.loadings2, main=Main,
                  xlab=xlabs, cex=1.5, col="blue", pch=1)
load2

Viram como é bem interessante “plotar” os loadings? Facilita a compreensão da importância das variáveis para os PCs.

Acessando resultados de PCA no ggplot2

Da mesma maneira que a função biplot, nós podemos representar graficamente o resultado da PCA utilizando o pacote ggplot2. A sintaxe é bem parecida com o boxplot que construímos anteriormente, mas aqui temos que lembrar que o tipo de gráfico seria de dispersão de pontos.

O ponto de partida é o conjunto de dados SCORES que construímos anteriormente. Os escores dos componentes que representam as parcelas de solo (LOCAIS) serão “plotados” no espaço bidimensional.

require(ggplot2)
## Loading required package: ggplot2
## Warning: package 'ggplot2' was built under R version 3.1.3
## 
## Attaching package: 'ggplot2'
## 
## The following object is masked from 'package:psych':
## 
##     %+%
# require(extrafont)
# loadfonts(device="win")

# vamos plotar o PC1 x PC2
ggPCA1 <- ggplot() + geom_text(data=SCORES, 
                               aes(x=PC1, y=PC2, label=rownames(SCORES)), 
                               size=4, col="red") +
                     theme_bw(base_size = 16)
  

# para definir parametros dos eixos e legendas
ggPCA2 <- ggPCA1 + xlab("PC1 (33,8%)") +
                  theme(axis.title.x=element_text(angle=0, size=12)) +
                  ylab("PC2 (22,3%)") +
                  theme(axis.title.y=element_text(angle=90, size=12))
                  
# visualizar
ggPCA2

MA-RA-VI-LHAAAA! #sóqnão

Cadê as variáveis?? Só “plotamos” as parcelas de solo… Para fazer isto temos que carregar os loadings, criando um objeto a partir de pca.solo$loadings

Vamos lá?

# para criar o conjunto de dados
PESO <- as.data.frame(pca.solo$loadings[1:14, 1:2])
str(PESO)
## 'data.frame':    14 obs. of  2 variables:
##  $ PC1: num  -0.216 0.811 0.828 0.82 0.803 ...
##  $ PC2: num  -0.222 0.37 0.289 0.151 0.175 ...
attach(PESO)

require(grid)
## Loading required package: grid
# para "plotar" segmentos devemos acessar o pacote "grid"
ggPCA3 <- ggPCA2 +
          geom_segment(data=PESO, aes(x=0, y=0, xend=PC1, yend=PC2),
                       arrow = arrow(length = unit(0.2, "cm"), 
                                     type = "closed", angle = 15),
                       color="black", alpha=0.5) +
          geom_text(data=PESO, aes(PC1*1.2, PC2*1.2,
                                   label=rownames(PESO)), color="black",
                                    fontface="italic", size=6)

ggPCA3