编程WLS功能excel vba

时间:2013-11-07 03:34:32

标签: excel vba excel-vba

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

如果有人能帮助我弄清楚为什么这不起作用我会非常感激。

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

1 个答案:

答案 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)

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