# plspm **Repository Path**: openResearch/plspm ## Basic Information - **Project Name**: plspm - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-04-27 - **Last Updated**: 2025-04-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # plspm `"plspm"` is an [R](http://www.r-project.org/) package dedicated to Partial Least Squares Path Modeling (PLS-PM) analysis for both *metric* and *non-metric* data. Versions later than 4.0 include a whole new set of features to handle non-metric variables. ## Donation As a Data Science and Statistics educator, I love to share the work I do. Each month I spend dozens of hours curating learning materials and computational tools like this R package. If you find any value and usefulness in `plspm`, please consider making a one-time donation---via paypal---in any amount (e.g. the amount you would spend inviting me a coffee or any other drink). Your support really matters. ## Installation You can install `"plspm"` using the function `install_github()` from package `"devtools"` ```r #option 1: from CRAN install.packages("plspm") #option 2: from github # install "devtools" install.packages("devtools") devtools::install_github("gastonstat/plspm") ``` ## PLS-PM with Metric Data Typical example with a Customer Satisfaction Model ```r # load plspm library(plspm) # load dataset satisfaction data(satisfaction) # define path matrix (inner model) IMAG < -c(0,0,0,0,0,0) EXPE <- c(1,0,0,0,0,0) QUAL <- c(0,1,0,0,0,0) VAL <- c(0,1,1,0,0,0) SAT <- c(1,1,1,1,0,0) LOY <- c(1,0,0,0,1,0) sat_path <- rbind(IMAG, EXPE, QUAL, VAL, SAT, LOY) # define list of blocks (outer model) sat_blocks <- list(1:5, 6:10, 11:15, 16:19, 20:23, 24:27) # vector of modes (reflective indicators) sat_modes <- rep("A", 6) # apply plspm with bootstrap validation satpls <- plspm(satisfaction, sat_path, sat_blocks, modes = sat_modes, scaled = FALSE, boot.val = TRUE) # default print satpls # summary of results summary(satpls) # plot inner model results plot(satpls, what = "inner") # plot outer model loadings plot(satpls, what = "loadings") # plot outer model weights plot(satpls, what = "weights") ``` ## PLS-PM with Non-Metric Data Example with the classic Russett data (original data set) ```ruby # load dataset russett A # (variable 'demo' as numeric) data(russa) # load dataset russett B # (variable 'demo' as factor) data(russb) # russett all numeric rus_path <- rbind(c(0, 0, 0), c(0, 0, 0), c(1, 1, 0)) rownames(rus_path) <- c("AGRI", "IND", "POLINS") colnames(rus_path) <- c("AGRI", "IND", "POLINS") rus_blocks <- list(1:3, 4:5, 6:9) rus_scaling <- list(c("NUM", "NUM", "NUM"), c("NUM", "NUM"), c("NUM", "NUM", "NUM", "NUM")) rus_modes <- c("A", "A", "A") ``` ### Example 1 PLS-PM using data set `russa` and scaling all 'NUM' ```ruby # PLS-PM using data set 'russa' rus_pls1 <- plspm(russa, rus_path, rus_blocks, scaling = rus_scaling, modes = rus_modes, scheme = "centroid", plscomp = c(1,1,1), tol = 0.0000001) rus_pls1 # outer model rus_pls1$outer_model # inner model rus_pls1$inner_model # scores head(rus_pls1$scores) # plot inner model plot(rus_pls1) ``` ### Example 2 PLS-PM using data set `russa`, and different scaling ```ruby # new scaling rus_scaling2 <- list(c("NUM", "NUM", "NUM"), c("ORD", "ORD"), c("NUM", "NUM", "NUM", "NOM")) # PLS-PM using data set 'russa' rus_pls2 <- plspm(russa, rus_path, rus_blocks, scaling = rus_scaling2, modes = rus_modes, scheme = "centroid", plscomp = c(1,1,1), tol = 0.0000001) # outer model rus_pls2$outer_model ``` ### Example 3 Now let's use data set `russb` (it contains a factor!) ```ruby # take a peek head(russb) # PLS-PM using data set 'russb' rus_pls3 <- plspm(russb, rus_path, rus_blocks, scaling = rus_scaling2, modes = rus_modes, scheme = "centroid", plscomp = c(1,1,1), tol = 0.0000001) # outer model rus_pls3$outer_model ``` ### Example 4 Now let's change modes ```ruby # modes new A rus_modes2 <- c("newA", "newA", "newA") # PLS-PM using data set 'russa' rus_pls4 <- plspm(russa, rus_path, rus_blocks, scaling = rus_scaling2, modes = rus_modes2, scheme = "centroid", plscomp = c(1,1,1), tol = 0.0000001) # outer model rus_pls4$outer_model ``` ### Example 5 Let's make things more interesting, flexible and versatile. How? What if you could have more freedom specifying the arguments? Now you can! Note that you can specify `blocks` using variables' names, the `scaling` types are NOT case senstive, neither are `modes` nor `scheme`. Isn't that cool? ```ruby # blocks rus_blocchi <- list( c("gini", "farm", "rent"), c("gnpr", "labo"), c("inst", "ecks", "death", "demo")) # scaling rus_scaling3 <- list(c("numeric", "numeric", "numeric"), c("ordinal", "ORDINAL"), c("NuM", "numer", "NUM", "nominal")) # modes new A rus_modes3 <- c("newa", "NEWA", "NewA") # PLS-PM using data set 'russb' rus_pls5 <- plspm(russb, rus_path, rus_blocchi, scaling = rus_scaling3, modes = rus_modes3, scheme = "CENTROID", plscomp = c(1,1,1), tol = 0.0000001) # outer model rus_pls5$outer_model ``` ## PLS-PM with non missing data Another nice feature is that you can perform a PLS-PM analysis on data containing missing values. ### Example We'll use the dataset `russa` and add some missing values. Then we'll handle all variables with a numeric `scaling`. ```ruby # let's add missing values to russa russNA <- russa russNA[1,1] <- NA russNA[4,4] <- NA russNA[6,6] <- NA # PLS-PM using data set 'russa' rus_pls6 <- plspm(russNA, rus_path, rus_blocks, scaling = rus_scaling, modes = rus_modes, scheme = "centroid", plscomp = c(1,1,1), tol = 0.0000001) rus_pls6 # outer model rus_pls6$outer_model # inner model rus_pls6$inner_model # scores head(rus_pls6$scores) # plot inner model plot(rus_pls6) ``` Authors Contact --------------- [Gaston Sanchez](https://www.gastonsanchez.com) (`gaston.stat at gmail.com`) [Laura Trinchera](http://rouenbs.academia.edu/LauraTrinchera) (`ltr at rouenbs.fr`) [Giorgio Russolillo](http://cnam.academia.edu/GiorgioRussolillo) (`giorgio.russolillo at cnam.fr`)