【问题标题】:Linest Polynomial Regression in Excel's VBAExcel VBA 中的线性多项式回归
【发布时间】:2016-08-12 10:46:16
【问题描述】:

我在查找有关在 Excel 的 VBA 中的子例程中使用 Linest 的信息时遇到问题。我需要返回一列 x 值(从第 17 行开始的 A 列)和一列 y 值(从第 17 行开始的 G 列)的多项式系数(三阶或四阶)。

我目前正在使用的代码如下所示,并且可以正常工作。

Dim X
X = Application.Evaluate("=linest(g17:g61,A17:A61^{1,2,3})")
Cells(3, 8) = X(1)
Cells(4, 8) = X(2)
Cells(5, 8) = X(3)
Cells(6, 8) = X(4) 

基本上,我需要能够使这个子例程处理任何长度的数据。数据将始终开始在第 17 行输入。为此,我一直在尝试使用类似于下面显示的代码。

Range(Cells(i, 1), Cells(Cells(Rows.Count, 1).End(xlUp).Row, 1)), Range(Cells(i, 2), Cells(Cells(Rows.Count, 2).End(xlUp).Row, 2))

但是,当我使用与上述类似的范围而不是 G17:G61 时,我会收到类型不匹配错误。我不明白为什么单元格范围与G17:G61 格式的单元格范围不同。我也尝试过使用简单的Range(Cells(17,1),Cells(61,1)) 而不是A17:A61

我也尝试过使用"G" & 17:"G" & 61 而不是G:17:G61,就像我在浏览时看到的那样,但这似乎也不能解决我的问题。

还有其他更好的功能吗?

请帮忙!

【问题讨论】:

  • 您的标题表明这是在 Excel 中进行回归的问题。 Excel VBA 中的编程范围确实是一个问题。这个网站上已经有很多很好的内容了。 This 有几个简单的例子。
  • 我在尝试使用 Linest 函数的能力范围内很难找到足够的信息(即用于更高多项式的 VBA),所以我一直在努力理解究竟是什么我应该输入。可以进一步扩展吗?

标签: vba excel regression excel-2013


【解决方案1】:

对您的问题的第一条评论使您走上正轨,Application.Evaluate 接受一个字符串(您必须在该字符串中建立对该范围的引用)。使用RangeCells 的第二种方法会创建一个对Range 的对象引用,如果您想使用对象引用,那么您可以将引用传递给Application.WorksheetFunction.LinEst,而不是评估字符串。

这是一个使用原始问题中的单元格引用的示例。

Public Sub TestLinest()

Dim x
Dim i as long
Dim evalString As String
Dim sheetDisplayName As String
Dim polyOrder as string

' this is whatever the name of your sheet containing data:
sheetDisplayName = "Sheet1"
' this gets the index of the last cell in the data range
i = Range(sheetDisplayName & "!A17").End(xlDown).Row
' Obviously change this depending on how many polynomial terms you need
polyOrder = "{1,2,3}"

evalString = "=linest(" & sheetDisplayName & "!E6:E" & i & ", " & sheetDisplayName & "!D6:D" & i & "^" & polyOrder & ")"
x = Application.Evaluate(evalString)

Cells(3, 8) = x(1)
Cells(4, 8) = x(2)
Cells(5, 8) = x(3)
Cells(6, 8) = x(4) 

End Sub

您可以看到有几个神奇的变量需要填写,包括范围、工作表名称和多项式顺序。也许这个例程可以扩展为将这些作为参数传递给函数并返回一个系数数组?


此时值得一提的是,您可以在不使用 VBA 的情况下实现所有这些,这意味着电子表格逻辑对您和/或您的用户仍然更加可见。以下是一些示例函数,可让您在工作表上完成所有这些操作,这是它的要点:

获取填充单元格的总数(假设这是在 A1 中)

=COUNT(A17:A10000)

将此作为数组公式输入:

=LINEST(INDIRECT("G17:G"&(A1+16)), INDIRECT("A17:A"&(A1+16))^{1,2,3})

这个公式中的 16 和 {1,2,3} 显然可以根据您的情况进行更改。

【讨论】:

  • 尝试单步调试代码并使用本地窗口查看变量包含的内容。在这种情况下,x 是一个二维数组,所以我认为您需要更多类似x(1,1) 的东西。另外,我最初并没有意识到您正在对 x、x^2、x^3 进行回归。为此,您需要在电子表格中添加单元格或自己计算数组以传递给 LinEst 函数。
  • 经过进一步调查,这只是将线性趋势的系数返回给数据。如何修改它以返回三次或四次系数?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-10
  • 1970-01-01
  • 2021-01-28
  • 2020-06-20
  • 2018-08-27
  • 2023-01-17
  • 1970-01-01
相关资源
最近更新 更多