2013-12-09 34 views
1

我有一个宏被写入来对用户选择的数据执行OLS回归。这是我正在写的一个更大的补充,但我坚持我认为必须是一个简单的问题。我不断收到一个下标超出范围的错误,我认为它是因为我得到了一个不同大小的矩阵来满足我的期望。回归输出中变量变量的错误

该子接受两个变量作为它的参数并计算给定规范的OLS估计量。 y变量总是一个n x 1范围(一列多行),X变量是一个n x m范围(可以是多列和多行)。当使用该功能时,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 

回答

1

当你指的是一个范围或从片材阵列始终是一个2维阵列带来的数据。第一个维度是行,第二个维度是列。

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


您的代码是正确的。

对于更深入的信息,请查看本post

+0

所以反正是有2维数组转换成一个维数组?目前我只是使用错误处理来解决它。 –

+0

通过一个循环并分配给另一个是我意识到VBA会支持的唯一途径。 –