1

我有一个宏,用于对用户选择的数据执行 OLS 回归。这是我正在写的一个更大的补充的一部分,但我被困在我认为一定是一个简单的问题上。我不断收到下标超出范围错误,我认为这是因为我得到的矩阵大小与我期望的不同。

sub 将两个变量作为其参数,并根据规范计算 OLS 估计量。y 变量始终是 anx 1 范围(一列和多行),X 变量是 anxm 范围(可以是多列和多行)。当 X 为单列范围时使用此函数时,该For... Next块适用于以下代码:

For bcnt = 1 To k
    Cells(bcnt, 1).Value = b(bcnt)
Next bcnt

但是如果 X 变量是一个多列范围,这将不起作用,它必须如下:

For bcnt = 1 To k
    Cells(bcnt, 1).Value = b(bcnt,1)
Next bcnt

我不明白为什么按照我的理解b应该始终是一维数组。

将不胜感激任何帮助。

实际子:

Sub OLSregress(y As Variant, X As Variant)
Dim Xtrans, XtransX, XtransXinv, Xtransy As Variant
Dim outputsheet As Worksheet
Dim b As Variant

' The equation for this estimator is b=[X'X]^(-1)X'Y


Xtrans = Application.WorksheetFunction.Transpose(X)
XtransX = Application.WorksheetFunction.MMult(Xtrans, X)
XtransXinv = Application.WorksheetFunction.MInverse(XtransX)
Xtransy = Application.WorksheetFunction.MMult(Xtrans, y)
b = Application.WorksheetFunction.MMult(XtransXinv, Xtransy)
k = Application.WorksheetFunction.Count(b)

Set ouputsheet = Sheets.Add(, ActiveSheet)
ActiveSheet.Name = "Regression Output"
For bcnt = 1 To k
    Cells(bcnt, 1).Value = b(bcnt, 1)
Next bcnt

End Sub
4

1 回答 1

1

当您引用范围或从工作表中引入数据时,数组始终是二维数组。第一个维度是行,第二个维度是列。

这是 VBA for excel 中常见的混淆点,因为它是在没有您干预的情况下完成的。


你的代码是正确的。

有关更深入的信息,请查看此帖子

于 2013-12-09T07:53:30.283 回答