编程WLSfunctionexcel vba

我正在尝试复制我在Excel中的教科书中find的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 

这个函数应该返回估计方程的解释variables的WLS估计量。 我理解了引导到k = Application.Count(b)行的代码,但不太清楚输出位如何工作。

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

以下是试图工作的函数的示例图像。 例

默认情况下,Excel将开始调整其数组的大小,如果您没有另行说明。 例如,

Redim arr(2,2)

实际上会给你一个3×3的数组

  0 1 2 0 blank | blank | blank 1 blank | blank | blank 2 blank | blank | blank 

正因为如此,当你有ReDim temp(n, n) ,你实际上是创build了一个多于你想要的行和列的数组。 在你的例子中,你会希望A3:18的对话框是一个16×16的对话框,但实际上会创build一个17×17的对话框,抛弃你的matrix乘法(即Application.MMult

replace这一行

ReDim temp(n, n)

用这条线

ReDim temp(1 to n, 1 to n)

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