Я не понимаю R, поэтому не могу точно сказать, что вы пытаетесь сделать, но в Excel есть множество функций для регрессионного анализа.
Функция SLOPE()
даст вамнаклон b (который я думаю, что вы подразумеваете под «коэффициентом»), а функция INTERCEPT()
даст вам y-перехват a (который, я думаю, вы подразумеваете под'постоянная').Существует также функция LINEST()
, которая может возвращать различные статистические данные, которые могут быть вам полезны (см. https://support.office.com/en-us/article/linest-function-84d7d0d9-6e50-4101-977a-fa7abf772b6d)
. Любая из этих функций Excel, введенная непосредственно в электронную таблицу, вернет значения, которые вы можете использовать безиспользование VBA. Однако ниже приведен код VBA для получения той же статистики. Это не самый эффективный способ управления данными, но я не уверен в вашем уровне опыта работы с Excel-VBA, поэтому я постарался сохранитькод прост для понимания. Возможно, вам придется поиграть с результатом LinEst
в зависимости от того, что вам нужно, и вы можете нарисовать дополнительные данные, изменив последний параметр на True
(обратите внимание, что возвращаемый массив станет двумернымпоэтому вам нужно изменить константы, указанные ниже):
Const COEFFICIENT_b As Long = 1
Const CONSTANT_a As Long = 2
Dim ws As Worksheet
Dim firstRow As Long, lastRow As Long, r As Long
Dim groupFirstRow As Long, groupLastRow As Long
Dim colGrp As Long, colX As Long, colY As Long, colB As Long, colA As Long
Dim groupID As Long
Dim rngX As Range, rngY As Range
Dim result As Variant
'Define range parameters
Set ws = ThisWorkbook.Worksheets("Sheet1") 'set this to your sheet object
firstRow = 2
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
colGrp = 1
colX = 2
colY = 3
colB = 4
colA = 5
'Set the group values to first item
groupID = ws.Cells(firstRow, colGrp).Value2
groupFirstRow = firstRow
For r = firstRow + 1 To lastRow
'Check for a new group.
If ws.Cells(r, colGrp).Value2 <> groupID Or r = lastRow Then
'Set the row limit for this group.
groupLastRow = IIf(r = lastRow, r, r - 1)
'Set the X and Y data ranges.
Set rngY = ws.Range(ws.Cells(groupFirstRow, colY), ws.Cells(groupLastRow, colY))
Set rngX = ws.Range(ws.Cells(groupFirstRow, colX), ws.Cells(groupLastRow, colX))
'Call the LinEst function.
result = WorksheetFunction.LinEst(rngY, rngX, True, False)
'Write the results to the sheet.
ws.Cells(groupFirstRow, colB) = result(COEFFICIENT_b)
ws.Cells(groupFirstRow, colA) = result(CONSTANT_a)
'Reset the groupId and row variables
groupID = ws.Cells(r, colGrp).Value2
groupFirstRow = r
End If
Next