我正在尝试复制我在excel教科书中找到的WLS(加权最小二乘)函数。有一个值出错,我认为我在使用该函数时做错了。
以下是支持函数Diag(w)的VBA代码和函数本身WLSregress():
Function Diag(W) As Variant
Dim n, i, j, k As Integer
Dim temp As Variant
n = W.Count
ReDim temp(n, n)
For i = 1 To n
For j = 1 To n
If j = i Then temp(i, j) = W(i) Else temp(i, j) = 0
Next j
Next i
Diag = temp
End Function
Function WLSregress(y As Variant, X As Variant, W As Variant) As Variant
Wmat = Diag(W)
n = W.Count
Dim Xtrans, Xw, XwX, XwXinv, Xwy As Variant
Dim m1, m2, m3, m4 As Variant
Dim output() As Variant
Xtrans = Application.Tranpose(X)
Xw = Application.MMult(Xtrans, Wmat)
XwX = Application.MMult(Xw, X)
XwXinv = Application.MInverse(XwX)
Xwy = Application.MMult(Xw, y)
b = Application.MMult(XwXinv, Xwy)
k = Application.Count(b)
ReDim output(k) As Variant
For bcnt = 1 To k
output(bcnt) = b(bcnt, 1)
Next bcnt
WLSregress = Application.Transpose(output)
End Function
该函数应返回WLS估计量,用于估计方程的解释变量。我理解导致k = Application.Count(b)
行的代码,但不太确定输出位是如何工作的。
如果有人能帮助我弄清楚为什么这不起作用我会非常感激。
以下是尝试工作的功能的示例图像。
答案 0 :(得分:3)
默认情况下,如果不另行指示,Excel将开始使用0调整其数组的大小。例如,
Redim arr(2,2)
实际上会给你一个3 x 3阵列
0 1 2
0 blank | blank | blank
1 blank | blank | blank
2 blank | blank | blank
正因为如此,当你拥有ReDim temp(n, n)
时,你实际上创建的数组中的行和列比实际需要的多一个。在你的例子中,你会期望A3:18的Dialog是一个16 x 16的对话框,但它实际上会创建一个17 x 17的对话框,抛弃你的矩阵乘法(即Application.MMult
)
替换此行
ReDim temp(n, n)
使用此行
ReDim temp(1 to n, 1 to n)
现在你应该得到结果了。由您决定结果是否准确。