Excel 仅将一个矩阵中的对角线值(其他单元格中为零)返回到具有相同尺寸的另一个矩阵
我必须通过收缩因子(λ)将方差协方差矩阵中的值向方差(矩阵中的对角值)收缩,因此: λ*收缩矩阵+(1-λ)*方差矩阵,其中: 方差协方差矩阵为:Excel 仅将一个矩阵中的对角线值(其他单元格中为零)返回到具有相同尺寸的另一个矩阵,excel,vba,matrix,covariance,Excel,Vba,Matrix,Covariance,我必须通过收缩因子(λ)将方差协方差矩阵中的值向方差(矩阵中的对角值)收缩,因此: λ*收缩矩阵+(1-λ)*方差矩阵,其中: 方差协方差矩阵为: 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
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
i、 e仅返回对角线值(=变量的方差)和所有其他单元格中的零
因此,以某种方式,使其返回一个矩阵,该矩阵仅包含行=列编号时的值,即。
(1,1)、(2,2)和(3,3)值
有人能帮上忙吗?您只需要一个从
i=1到3
计数的循环,就可以使用矩阵(i,i)
、矩阵(2,2)
和矩阵(3,3)
来填充矩阵(i,i)
请注意,我将矩阵维度矩阵(1到MatrixDimension,1到MatrixDimension)
更改为从1
开始,而不是0
,因此您可以轻松使用它将其写入单元格:
Sub test()
Range("A5:C7").Value = VarCovar(Range("A1:C3"))
End Sub
如果在循环中有一个if语句if i=j then.value=0@Jo.lass为什么这么复杂?只要放下j
循环,用i
@Jo.lass替换j
,你会把if语句放在编码的什么地方?@Pernille不要这样做,那会让你的代码变慢。我修正了我的答案,请看一下。谢谢你的帮助!我仍然有问题(很抱歉,我对VBA完全陌生,不完全了解所有编码),我有这个区域,比如A3:F27,它有不同变量的返回(6个变量,每个变量有24个观察值)。您刚才编写的函数不是作为:VarCovar(A3:F27)使用的,因为它附带消息“not symetric matrix”。然后我尝试将您的函数重命名为“VarCovarZeros”,并尝试:VarCovarZeros(VarCovar(A3:F27))其中VarCovar是“我的”原始函数。这将返回#值,i、 e.不工作。我需要将“原始数据”转换成一个矩阵,该矩阵只给出对角线上的方差和其他地方的零,或者将“我的”VarCovar矩阵转换成一个具有(1,1)、(2,2)、(3,3)。。。等。其中的值和其他地方的零。这有意义吗?@Pernille啊,我想我明白了。我更改了答案,请再试一次。
Sub test()
Range("A5:C7").Value = VarCovar(Range("A1:C3"))
End Sub