0

所以这是我的情况:

我有大量数据,x 值为 1-18,但 y 值会有所不同。其中一些是空白,因为等式是 /0 - 排列成行。

我正在尝试获取每行 y 值的多项式趋势线的 m^3、m^2、m、c 系数.. y1、y2 等。

因为我不能将 Linest() 与空白一起使用,所以我尝试使用 VBA 复制所有相关(非空白)的 y 值,但也删除了该行的关联 x 值。

这是数据的示例部分 - 但还有更多行

x   1    2  3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18  m3  m2  m   c
y1  0.0 1.0 2.0 2.0 1.0 0.0 1.0 -   2.0 2.0 1.0 2.0 2.5 1.0 1.0 2.0 1.0 4.0 ?   ?   ?   ?
y2  0.0 1.0 -   2.0 2.0 0.0 2.0 2.0 0.0 1.7 4.0 1.0 2.0 2.0 4.0 1.0 3.0 2.0 ?   ?   ?   ?

到目前为止,我一直在尝试但没有取得多大成功。

到目前为止,我一直在尝试这样的事情,但没有成功,但这是我第一次尝试 VBA .. 如果我不知道显而易见的事情,很抱歉!

'code to identify known_y and known_x ranges
For each testvalue in known_y
If testvalue indicates that this point should be included in regression
   then copy this data point (both known_y and known_x value for this point) either into an array (if I want to invoke LINEST() from within VBA) or into another range in the spreadsheet.
Next testvalue
Invoke LINEST() using the copied data

如果有人可以提供帮助,将不胜感激!!

4

1 回答 1

1

这是使用 VBA 的一种方法。由于您从寻找 m3 开始,我假设这是一个三阶多项式。无论如何,在 UDF myPolyLinest 中,“order”是一个名为“maxPower”的参数。除此之外,它类似于 worksheet 函数,并返回相同的结果数组。它过滤掉没有数字的列值。它单独为每组 Y 值执行此操作。

工作表上的公式如下所示:

m3:  =INDEX(myPolyLinest($B2:$S2,$B$1:$S$1,3),1,1)
m2:  =INDEX(myPolyLinest($B2:$S2,$B$1:$S$1,3),1,2)
m1   =INDEX(myPolyLinest($B2:$S2,$B$1:$S$1,3),1,2)

其中 INDEX 函数的参数用于返回所需的值我不确定您所说的“c”系数是什么意思,因为我的 Excel 版本的 LINEST 帮助中没有描述。但是您应该能够从该文件和返回值的描述中弄清楚。

Option Explicit
Function myPolyLinest(knownYs As Range, knownXs As Range, Optional maxPower As Long = 1, _
    Optional notForceZero As Variant = True, Optional Stats As Variant = False) As Variant
  Dim vX As Variant, vY As Variant
  Dim I As Long
  Dim J As Long
  Dim colXY As Collection

vX = knownXs
vY = knownYs

Set colXY = New Collection

For I = 1 To UBound(vX, 1)
    For J = 1 To UBound(vX, 2)
        If Not IsError(vY(I, J)) Then
            If vX(I, J) <> "" And vY(I, J) <> "" And _
                IsNumeric(vX(I, J)) And IsNumeric(vY(I, J)) Then
                colXY.Add Array(vX(I, J), vY(I, J))
            End If
        End If
    Next J
Next I

ReDim vX(1 To colXY.Count, 1 To maxPower)
ReDim vY(1 To colXY.Count, 1 To 1)


For I = 1 To colXY.Count
    For J = 1 To maxPower
        vX(I, J) = colXY(I)(0) ^ (J)
    Next J
    vY(I, 1) = colXY(I)(1)
Next I

myPolyLinest = WorksheetFunction.LinEst(vY, vX, notForceZero, Stats)

End Function
于 2014-07-21T00:11:16.087 回答