Calculating the consistent reliability coefficient rho_A in R

1,240 views
Skip to first unread message

Nicholas Brown

unread,
Nov 17, 2016, 4:06:12 AM11/17/16
to PLS-SEM
Sorry if this is not the place to post this question.

I am trying to implement in R the consistent reliability coefficient rho_A proposed in "Consistent Partial Least Squares Path Modeling" by Dijkstra and Henseler (equation 3). For that I am using the semPLS package as a starting point.

I have built the following function to calculate rho_A for a given LV:

rho_a <- function(w, S) {
    ww
<- w %*% t(w)
    numer
<- t(w) %*% (S-diag(S)) %*% w
    denom
<- t(w) %*% (ww-diag(ww)) %*% w
    rho
<- (t(w) %*% w)^2 * numer / denom
   
return(rho)
}
where w is the vector containing the estimated weights for the LV, and S is the empirical covariance matrix of the LV's indicators.
Using semPLS, I calculate w and S as it follows:

w <- my.pls$outer_weights[1:3,1]
(here I assume the LV of interest correspond to the first column in the outer_weights matrix, and its indicators are in the first three rows)

data <- scale(data)
S
<- cov(data[,1:3])

(here data contains all the observations and its three first columns correspond to the LV's indicators; scale() standardizes the data)

Unfortunately, when I run this code I obtain strange values, much bigger than 1.
Am I doing something wrong in my calculation of rho_A? In the calculation of w or S? Thanks for your help!

Cheers,
Nicholas

Schuberth Florian

unread,
Nov 17, 2016, 4:58:18 AM11/17/16
to PLS-SEM
Dear Nicholas,
 
your implementation looks fine.
 
It is some time ago that I worked with the semPLS package. Have you used also the scaled data set as input? Are the final weights scaled so that the composite has a unit variance?
 
var(data[,1:3]%*%w) should return 1
 
Things will be easier, if you present the results from the analysis. 
 
What you can also do is to use matrixpls, there it is well implemented.
 
Best regards,
Florian

---------------------------------
Florian Schuberth
Research Assistant
Chair of Econometrics, Room 498a
University of Wuerzburg
Sanderring 2
97070 Wuerzburg, Germany


>>> Nicholas Brown <nicoca...@gmail.com> 17.11.2016 10:06 >>>
--
Join us at the PLS Applications Symposium: http://plsas.net
---
You received this message because you are subscribed to the Google Groups "PLS-SEM" group.
To unsubscribe from this group and stop receiving emails from it, send an email to pls-sem+u...@googlegroups.com.
To post to this group, send email to pls...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Nicholas Brown

unread,
Nov 17, 2016, 9:44:08 AM11/17/16
to PLS-SEM, florian....@uni-wuerzburg.de
Thanks Florian,

It is good to know you think the code is ok.
Yes, I scale the data before building the covariance matrix S.
var(data[,1:3]%*%w) gives 1
t(w) %*% S %*% w also gives 1

What results would you like to see? (I get  rho_a=34.04961)

I have checked matrixpls, but from what I see it gives two measures of reliability. One is Cronbach's alpha. The other is a "reliability estimation based on weights and loadings", which does not seem to correspond to rho_A.

Cheers,
Nicholas

Schuberth Florian

unread,
Nov 17, 2016, 10:18:43 AM11/17/16
to PLS-SEM
Dear Nicholas,
 
I think I found the problem. Use diag(diag(S)) instead of diag(S) and of course for the other matrices too where it is required. See the following
 
> diag(matrix(1:4,2))
[1] 1 4
 
Returns a vector, which we do not want in this case, since we want to get rid of the main diagonal elements. In contrast
 
> diag(diag(matrix(1:4,2)))
     [,1] [,2]
[1,]    1    0
[2,]    0    4
 
 
returns the appropriate matrix
 
I hope this helps!
 
Best regards,
Flo


---------------------------------
Florian Schuberth
Research Assistant
Chair of Econometrics, Room 498a
University of Wuerzburg
Sanderring 2
97070 Wuerzburg, Germany
>>> Nicholas Brown <nicoca...@gmail.com> 17.11.2016 15:44 >>>

Nicholas Brown

unread,
Nov 18, 2016, 7:27:38 AM11/18/16
to PLS-SEM, florian....@uni-wuerzburg.de
Thanks a lot Florian!
That was the problem! Using diag(diag(S)) and diag(diag(ww)) works fine.

Cheers,
Nicholas

Schuberth Florian

unread,
Nov 18, 2016, 8:04:20 AM11/18/16
to PLS-SEM
Dear Nicolas,
 
you are welcome.
 
To answer your question regarding matrixpls: Estimate your model with matrixpls using PLSc
 
plsc   =matrixpls(cor(DATA),model = model,innerEstim=innerEstim.centroid,
                   parameterEstim = parameterEstim.separate,
                   disattenuate=TRUE,
                   parametersReflective = estimator.plscLoadings,
                   parametersInner = estimator.ols)
 
Now you can access rho_A using the following lines:
 
attr(plsc,'Q')
 
 I hope this works...Then you can compare your results
 
Have a nice day,
Flo
 

---------------------------------
Florian Schuberth
Research Assistant
Chair of Econometrics, Room 498a
University of Wuerzburg
Sanderring 2
97070 Wuerzburg, Germany


>>> Nicholas Brown <nicoca...@gmail.com> 18.11.2016 13:27 >>>

Mikko Rönkkö

unread,
Nov 21, 2016, 6:22:45 AM11/21/16
to pls...@googlegroups.com
Hi,

The reliability formula used by default in matrixpls is a generic reliability formula which is consistent for any weights if consistent loadings are available. rho_A is a special case of this generic formula. Whereas rho_A is consistent only for PLS Mode A weights, the generic reliability formula used in matrixpls is consistent for PLS Mode B, GSCA, equal, or any other weights as well.

See this working paper for an explanation of the reliability equations:

Rönkkö, M., McIntosh, C. N., & Aguirre-Urreta, M. I. (2016). Improvements to PLSc: Remaining problems and simple solutions. Unpublished Working Paper. Retrieved from http://urn.fi/URN:NBN:fi:aalto-201603051463

The reliabilty equation used in matrixpls is referred to as CRw in the paper. Note that consistency does not guarantee unbiasedness and we find that in certain conditions Cronbach’s alpha works better than rho_A in small samples, which is the reason why alpha is implemented as an alternative reliability estimator in matrixpls. Also, the direction of bias in these two statistics differ. Alpha is biased negatively and rho_A positively. If you must choose between two biased estimators, it is a good practice to be conservative. If you want to convince the reader that your composites are reliable, you should choose a negatively biased statistics (Alpha) over positively biased statistic (rho_a). But for disattenuation, you should undercorrect rather than overcorrect, which would imply that overestimating reliability is more appropriate than underestimation.

Mikko
Reply all
Reply to author
Forward
0 new messages