0

我正在尝试复制我在 Excel 教科书中找到的 WLS(加权最小二乘)函数。出现值错误,我认为我在使用该函数时做错了。

以下是支持函数 Diag(w) 和函数本身 WLSregress() 的 VBA 代码:

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)行的代码,但不太确定输出位是如何工作的。

如果有人可以帮助我弄清楚为什么这不起作用,我将不胜感激。

以下是该功能尝试工作的示例图像。 例子

4

1 回答 1

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 的对话框是 16 x 16 对话框,但它实际上会创建一个 17 x 17 对话框,从而放弃矩阵乘法(即Application.MMult

替换此行

ReDim temp(n, n)

有了这条线

ReDim temp(1 to n, 1 to n)

你现在应该得到返回的结果。由您决定结果是否准确。

于 2013-11-07T05:09:12.617 回答