所以这是我的情况:
我有大量数据,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
如果有人可以提供帮助,我们将不胜感激!!
答案 0 :(得分:1)
这是使用VBA的一种方法。因为你从寻找m3开始,我假设这是一个三阶多项式。无论如何,在UDF myPolyLinest中,“order”是一个名为“maxPower的参数。除此之外,它类似于工作表函数,并返回相同的结果数组。它过滤掉没有数字的列值。它分别对每组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