분산-공분산 행렬의 값을 축소 계수 (람다)에 의해 분산 (행렬의 대각선 값)으로 축소해야합니다. 따라서 lambda * shrinkagematrix + (1-lambda) * variancecovariancematrix, 여기서 :
분산 공분산 행렬은 다음과 같습니다.
Function VarCovar(rng As Range) As Variant
Dim i As Integer
Dim j As Integer
Dim numcols As Integer
numcols = rng.Columns.Count
numrows = rng.Rows.Count
Dim matrix() As Double
ReDim matrix(numcols - 1, numcols - 1)
For i = 1 To numcols
For j = 1 To numcols
matrix(i - 1, j - 1) = Application.WorksheetFunction.Covar(rng.Columns(i), rng.Columns(j)) * numrows / (numrows - 1)
Next j
Next i
VarCovar = matrix
, 이것은 나에게 다음과 같은 매트릭스를 제공합니다.
0.40 -0.10 0.11
-0.10 0.17 -0.03
0.11 -0.03 0.19
그런 다음 다음과 같은 수축 매트릭스를 만드는 데 문제가 있습니다.
0.40 0.00 0.00
0.00 0.17 0.00
0.00 0.00 0.19
즉, 대각선 값 (= 변수의 분산) 만 반환하고 다른 모든 셀에서는 0을 반환합니다.
따라서 어떤 방식으로 행 = 열 수인 경우에 대한 값, 즉 (1,1), (2,2) 및 (3,3) 값만 포함하는 행렬을 반환합니다.
이것에 도움이 될 사람이 있습니까?
당신은에서 카운트가 하나 개의 루프가 필요 i = 1 to 3
채우기를 Matrix(1, 1)
, Matrix(2, 2)
및 Matrix(3, 3)
사용Matrix(i, i)
Function VarCovar(InputMatix As Range) As Variant
Dim MatrixColumns As Long
MatrixColumns = InputMatix.Columns.Count
Dim MatrixRows As Long
MatrixRows = InputMatix.Rows.Count
Dim Matrix() As Double
ReDim Matrix(1 To MatrixColumns, 1 To MatrixColumns)
Dim i As Long
For i = 1 To MatrixColumns
Matrix(i, i) = Application.WorksheetFunction.Covar(InputMatix.Columns(i), InputMatix.Columns(i)) * MatrixRows / (MatrixRows - 1)
Next i
VarCovar = Matrix
End Function
내가 변경된 것을 참고 Matrix
dimenstions을 Matrix(1 To MatrixDimension, 1 To MatrixDimension)
시작하는 1
하지 0
쉽게 세포에 기록하는 데 사용할 수 있습니다 :
Sub test()
Range("A5:C7").Value = VarCovar(Range("A1:C3"))
End Sub
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다