Search code examples
rpcarecipetidymodels

PCA, TidyModels; how to change rotation method in step_pca?


I'm trying to preform PCA (principal component analysis) using TidyModels. I have created a recipe but I don't know how can I change the default rotation used in `step_pca() method (such as changing it to say Varimax rotation). any ideas?

this is my recipe:

pembqol_rec <- recipe(~., data = df) %>% 
  update_role(id, name, new_role = "id") %>%
  step_naomit(all_predictors()) %>% 
  step_normalize(all_predictors()) %>% 
  step_pca(all_predictors(), id = "pca") %>% 
  prep()

Solution

  • The step_pca() function uses stats::prcomp() under the hood, which I don't believe supports that, but you can get out the loadings using tidy() and the type = "coef" argument and then apply a rotation yourself. See this Cross Validated answer for more info.

    library(recipes)
    #> Loading required package: dplyr
    #> 
    #> Attaching package: 'dplyr'
    #> The following objects are masked from 'package:stats':
    #> 
    #>     filter, lag
    #> The following objects are masked from 'package:base':
    #> 
    #>     intersect, setdiff, setequal, union
    #> 
    #> Attaching package: 'recipes'
    #> The following object is masked from 'package:stats':
    #> 
    #>     step
    
    rec <- recipe( ~ ., data = USArrests) %>%
      step_normalize(all_numeric()) %>%
      step_pca(all_numeric(), num_comp = 3)
    
    prep(rec) %>% tidy(number = 2, type = "coef")
    #> # A tibble: 16 × 4
    #>    terms      value component id       
    #>    <chr>      <dbl> <chr>     <chr>    
    #>  1 Murder   -0.536  PC1       pca_L9R48
    #>  2 Assault  -0.583  PC1       pca_L9R48
    #>  3 UrbanPop -0.278  PC1       pca_L9R48
    #>  4 Rape     -0.543  PC1       pca_L9R48
    #>  5 Murder    0.418  PC2       pca_L9R48
    #>  6 Assault   0.188  PC2       pca_L9R48
    #>  7 UrbanPop -0.873  PC2       pca_L9R48
    #>  8 Rape     -0.167  PC2       pca_L9R48
    #>  9 Murder   -0.341  PC3       pca_L9R48
    #> 10 Assault  -0.268  PC3       pca_L9R48
    #> 11 UrbanPop -0.378  PC3       pca_L9R48
    #> 12 Rape      0.818  PC3       pca_L9R48
    #> 13 Murder    0.649  PC4       pca_L9R48
    #> 14 Assault  -0.743  PC4       pca_L9R48
    #> 15 UrbanPop  0.134  PC4       pca_L9R48
    #> 16 Rape      0.0890 PC4       pca_L9R48
    

    Created on 2022-01-10 by the reprex package (v2.0.1)