I need help in modifying the appended Partial Correlation UDF to Semipartial Correlation UDF.
A note on Semipartial Correlation (and Partial) can be found at http://www.listendata.com/2017/03/pa...rrelation.html
The Partial Correlation UDF is:
Function pCorrel(R)
Dim iRows As Integer, iCols As Integer
Dim Identity() As Double, RDiag() As Double, RDiagSQRT() As Double, Part_Correl() As Double
iRows = R.Rows.Count
iCols = R.Columns.Count
RInverse = Application.MInverse(R)
ReDim Identity(1 To iRows, 1 To iCols)
ReDim RDiag(1 To iRows, 1 To iCols)
ReDim RDiagSQRT(1 To iRows, 1 To iCols)
ReDim Part_Correl(1 To iRows, 1 To iCols)
For i = 1 To iRows
For j = 1 To iCols
Identity(i, j) = 0
RDiag(i, j) = 0
If i = j Then
Identity(i, j) = 1
RDiag(i, j) = 1 / RInverse(i, j)
RDiagSQRT(i, j) = RDiag(i, j) ^ 0.5
End If
Next j
Next i
P2_Neg = (Application.MMult(RDiagSQRT, Application.MMult(RInverse, RDiagSQRT)))
For i = 1 To iRows
For j = 1 To iCols
Part_Correl(i, j) = Identity(i, j) - P2_Neg(i, j)
Part_Correl(i, i) = -1
Next j
Next i
pCorrel = Part_Correl
End Function
Display More
Further to add an example, if the correlation matrix for three variables is:
[TABLE="class: cms_table, width: 270"]
[TD="align: right"]1.000000
[/TD]
[TD="align: right"]0.920000
[/TD]
[TD="align: right"]0.870000
[/TD]
[TD="align: right"]0.920000
[/TD]
[TD="align: right"]1.000000
[/TD]
[TD="align: right"]0.810000
[/TD]
[TD="align: right"]0.870000
[/TD]
[TD="align: right"]0.810000
[/TD]
[TD="align: right"]1.000000
[/TD]
[/TABLE]
... the array function pCorrel() gives the following output.
[TABLE="class: cms_table, width: 225"]
[TD="align: right"]-1.00000
[/TD]
[TD="align: right"]0.744621
[/TD]
[TD="align: right"]0.543004
[/TD]
[TD="align: right"]0.744621
[/TD]
[TD="align: right"]-1.00000
[/TD]
[TD="align: right"]0.049680
[/TD]
[TD="align: right"]0.543004
[/TD]
[TD="align: right"]0.049680
[/TD]
[TD="align: right"]-1.00000
[/TD]
[/TABLE]
.. Now, instead of Partial, I am looking for Semipartial UDF.