forked from ISS-Leimen/pls-predict
-
Notifications
You must be signed in to change notification settings - Fork 12
/
Copy pathPLSpredict.R
90 lines (73 loc) · 2.97 KB
/
PLSpredict.R
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#PLSpredict
#Description: This library contains the functions utilized to run the PLS-PM
# algorithm and its predictions.
#Function that receives a model and predicts measurements
PLSpredict <- function(trainData, testData, smMatrix, mmMatrix, maxIt=300, stopCriterion=7){
#Call simplePLS function
plsModel <- simplePLS(trainData, smMatrix, mmMatrix, maxIt, stopCriterion)
#Get results from model
smMatrix <- plsModel$smMatrix
mmMatrix <- plsModel$mmMatrix
ltVariables <- plsModel$ltVariables
mmVariables <- plsModel$mmVariables
outer_weights <- plsModel$outer_weights
outer_loadings <- plsModel$outer_loadings
meanData<-plsModel$meanData
sdData <- plsModel$sdData
path_coef<-plsModel$path_coef
#Create container for Exogenous Variables
exVariables = NULL
#Create container for Endogenous Variables
enVariables = NULL
#Identify Exogenous and Endogenous Variables
exVariables <- unique(smMatrix[,1])
pMeasurements <- NULL
for (i in 1:length(exVariables)){
pMeasurements <- c(pMeasurements,mmMatrix[mmMatrix[,"latent"]==exVariables[i],"measurement"])
}
enVariables <- unique(smMatrix[,2])
resMeasurements <- NULL
for (i in 1:length(enVariables)){
resMeasurements <- c(resMeasurements, mmMatrix[mmMatrix[, "latent"] == enVariables[i],"measurement"])
}
enVariables <- setdiff(enVariables,exVariables)
eMeasurements <- NULL
for (i in 1:length(enVariables)){
eMeasurements <- c(eMeasurements, mmMatrix[mmMatrix[, "latent"] == enVariables[i],"measurement"])
}
#Extract Measurements needed for Predictions
normData <- testData[,pMeasurements]
#Normalize data
for (i in pMeasurements)
{
normData[,i] <-(normData[,i] - meanData[i])/sdData[i]
}
#Convert dataset to matrix
normData<-data.matrix(normData)
#Add empty columns to normData for the estimated measurements
for (i in 1:length(eMeasurements))
{
normData = cbind(normData, seq(0,0,length.out =nrow(normData)))
colnames(normData)[length(colnames(normData))]=eMeasurements[i]
}
#Estimate Factor Scores from Outter Path
fscores <- normData%*%outer_weights
#Estimate Factor Scores from Inner Path and complete Matrix
fscores <- fscores + fscores%*%path_coef
#Predict Measurements with loadings
predictedMeasurements<-fscores%*% t(outer_loadings)
#Denormalize data
for (i in mmVariables)
{
predictedMeasurements[,i]<-(predictedMeasurements[,i] * sdData[i])+meanData[i]
}
#Calculating the residuals
residuals <- testData[,resMeasurements] - predictedMeasurements[,resMeasurements]
#Prepare return Object
predictResults <- list(testData = testData[,resMeasurements],
predictedMeasurements = predictedMeasurements[,resMeasurements],
residuals = residuals,
compositeScores = fscores)
class(predictResults) <- "predictResults"
return(predictResults)
}