VBA Итеративная регрессия - PullRequest
0 голосов
/ 10 января 2019

Я работаю над кодом для выполнения итеративного регрессионного анализа пользовательского набора точек данных из большего набора данных. Выводом является значение R ^ 2, где другая часть моего кода будет захватывать максимальное значение и индексы, где это значение встречается. Одна из проблем, с которыми я сталкиваюсь с последовательностью итеративной регрессии, состоит в том, что цикл будет работать только для определенных значений «sample_count» в зависимости от длины входных данных. Любая помощь приветствуется, так как я смотрю на это уже некоторое время.

Lastrow = Range("G" & Rows.Count).End(xlUp).Row
Range("I2:I" & Lastrow).Formula = "=$B$1*(G2/60)"
Range("J2:J" & Lastrow).Formula = "=($B$2*0.002)+I2"

sample_count = Application.InputBox("Please Enter       Number of Data Points to Consider for Linearity", , Type:=1)
Set r = Range("E2")
N = Range(r, r.End(xlDown)).Rows.Count
i = 0: j = 0

Do While i + 2 * sample_count < N
Set rX = r.Offset(i, 4).Resize(sample_count, 1)
Set ry = r.Offset(i, 0).Resize(sample_count, 1)
rsquare = Application.WorksheetFunction.RSq(ry, rX)
r.Offset(j, 7).Value = rsquare
i = i + sample_count
j = j + 1
Loop

Ответы [ 2 ]

0 голосов
/ 10 января 2019

Я полагаю, что проблема заключается в том, как вы выполняете итерацию. Например, если я беру параметры N = 32 и мой sample_count равен 8 и анализирую цикл, используя

Do While i + 2 * sample_count < N
    i = i + sample_count
    j = j + 1
    Debug.Print "@ iteration " & j & " i = " & i & vbCrLf; "i + 2 * sample_count = " & i + 2 * sample_count & " < " & N
Loop 

Я получаю

iteration 1 i = 8  
i + 2 * sample_count = 24 < 32  
iteration 2 i = 16  
i + 2 * sample_count = 32 < 32

Таким образом, я получаю только 2 из 4 моих выборочных групп. При этом, предполагая, что вы хотите .Offset with sample_count, я думаю, что вы могли бы эффективно достичь того, что вы ищете, заменив цикл Do While Loop на

For i = 0 To N Step sample_count
    Set rX = r.Offset(i, 4).Resize(sample_count, 1)
    Set ry = r.Offset(i, 0).Resize(sample_count, 1)
    rsquare = Application.WorksheetFunction.RSq(ry, rX)
    r.Offset(i + sample_count, 7).Value = rsquare
End Sub
0 голосов
/ 10 января 2019

Попробуйте установить исходные диапазоны вне цикла, и тогда вы можете просто сместить в цикле.

Я не уверен, есть ли другие проблемы.

Хорошей практикой является объявление ваших переменных .

Set rX = r.Offset(, 4).Resize(sample_count, 1) 'H3:H52
Set rY = r.Resize(sample_count, 1)

Do While i + 2 * sample_count < N
    rsquare = Application.WorksheetFunction.RSq(rY, rX)
    r.Offset(j, 7).Value = rsquare
    i = i + sample_count
    j = j + 1
    Set rX = rX.Offset(sample_count)
    Set rY = rY.Offset(sample_count)
Loop
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...