powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / ...использование Application.Frequency
11 сообщений из 36, страница 2 из 2
...использование Application.Frequency
    #36614340
SirFisher
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
KL (XL),
в данной теме я с Вашей помощью и помощью vlth разбирался в применении функции "=ЧАСТОТА()".
Она является составной частью функции, рассчитывающей критерий Колмогорова-Смирнова (код ниже), который готовлю для оценки сходства/различия вариационных рядов.
Если будут предложения по модернизации кода - буду рад.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
Public Function test_Kolmogorova_Smirnova(r1 As Object, R2 As Object)
    'критерий Колмогорова-Смирнова
    'Критерий чувствителен к количеству значений. Для правильных расчетов их должно быть >=50

    Dim min_R1_R2 As Double, max_R1_R2 As Double
    Dim i As Double
    Dim R1_count As Long, R2_count As Long
    Dim freq_R1 As Variant, freq_R2 As Variant, data_r1 As Variant
    Dim max_data_R1_R2 As Variant, data_R1_R2 As Variant
    Dim Krit_KS_temp As Variant
    
    With Application.WorksheetFunction
        min_R1_R2 = .Min(r1, R2)
        max_R1_R2 = .Max(r1, R2)
        R1_count = .CountIf(r1, "<>")
        R2_count = .CountIf(R2, "<>")
    End With
    
    For i = min_R1_R2 To max_R1_R2
        With Application.WorksheetFunction
            freq_R1 = .Frequency(r1, Array(i))
            freq_R2 = .Frequency(R2, Array(i))
        End With
            
        data_R1_R2 = freq_R1( 1 ,  1 ) / R1_count - freq_R2( 1 ,  1 ) / R2_count
        If max_data_R1_R2 < data_R1_R2 Then max_data_R1_R2 = data_R1_R2
    Next i
      
        Krit_KS_temp = max_data_R1_R2 * ((R1_count * R2_count) / (R1_count + R2_count)) ^  0 . 5 
        Krit_KS_temp = Application.WorksheetFunction.Text(.Round(Krit_KS_temp,  3 ), "###0.000")
  
    'перебираем критериальные значения
        If Krit_KS_temp >  1 . 36  Then test_Kolmogorova_Smirnova = Krit_KS_temp & "; p<0.05"
        If Krit_KS_temp >  1 . 95  Then test_Kolmogorova_Smirnova = Krit_KS_temp & "; p>0.001"
        If Krit_KS_temp >  1 . 63  Then test_Kolmogorova_Smirnova = Krit_KS_temp & "; p<0.01"
        If Krit_KS_temp <  1 . 36  Then test_Kolmogorova_Smirnova = Krit_KS_temp & "; p>0.05"

End Function

Функция не закончена. В дальнейшем, в частности, будет добавлена часть кода для строительства вариационного ряда, в т.ч. для определения шага между классами вариационного ряда.
...
Рейтинг: 0 / 0
...использование Application.Frequency
    #36614347
SirFisher
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И еще. Каким образом подвесить справку к создаваемой пользовательской функции?
...
Рейтинг: 0 / 0
...использование Application.Frequency
    #36614485
Фотография vlth
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не по сути (изменены типы переменных в передаваемых аргументах и других объявлениях, а также структура функции)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
Public Function test_Kolmogorova_Smirnova(r1 As Range, R2 As Range)
    'критерий Колмогорова-Смирнова
    'Критерий чувствителен к количеству значений. Для правильных расчетов их должно быть >=50

    Dim min_R1_R2 As Double, max_R1_R2 As Double
    Dim i As Double
    Dim R1_count As Long, R2_count As Long
    Dim freq_R1 As Variant, freq_R2 As Variant, data_r1 As Double
    Dim max_data_R1_R2 As Double, data_R1_R2 As Double
    Dim Krit_KS_temp As Double
    
    With Application.WorksheetFunction
        min_R1_R2 = .Min(r1, R2)
        max_R1_R2 = .Max(r1, R2)
        R1_count = .CountIf(r1, "<>")
        R2_count = .CountIf(R2, "<>")
    
        For i = min_R1_R2 To max_R1_R2
            freq_R1 = .Frequency(r1, Array(i))
            freq_R2 = .Frequency(R2, Array(i))
            data_R1_R2 = freq_R1( 1 ,  1 ) / R1_count - freq_R2( 1 ,  1 ) / R2_count
            If max_data_R1_R2 < data_R1_R2 Then max_data_R1_R2 = data_R1_R2
        Next i
          
        Krit_KS_temp = max_data_R1_R2 * ((R1_count * R2_count) / (R1_count + R2_count)) ^  0 . 5 
        Krit_KS_temp = .Text(.Round(Krit_KS_temp,  3 ), "###0.000")
    End With
    'перебираем критериальные значения
        If Krit_KS_temp >  1 . 36  Then test_Kolmogorova_Smirnova = Krit_KS_temp & "; p<0.05"
        If Krit_KS_temp >  1 . 95  Then test_Kolmogorova_Smirnova = Krit_KS_temp & "; p>0.001"
        If Krit_KS_temp >  1 . 63  Then test_Kolmogorova_Smirnova = Krit_KS_temp & "; p<0.01"
        If Krit_KS_temp <  1 . 36  Then test_Kolmogorova_Smirnova = Krit_KS_temp & "; p>0.05"
End Function

SirFisher, в опубликованном варианте . Round() "висит в воздухе".
...
Рейтинг: 0 / 0
...использование Application.Frequency
    #36614554
SirFisher
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vlth,

да, поторопился опубликовать, вот и "подвисло" округление.

Не соглашусь насчет перевода Krit_KS_temp в Double, он в Variant работает
...
Рейтинг: 0 / 0
...использование Application.Frequency
    #36614576
Фотография vlth
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SirFisherНе соглашусь насчет перевода Krit_KS_temp в Double, он в Variant работаетПарадоксальная фраза
Вы хотите сказать, что с Double не работает?
...
Рейтинг: 0 / 0
...использование Application.Frequency
    #36614587
Фотография vlth
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SirFisher, кстати, подумайте над типом переменной i : как-то странно смотрится Double в кач-ве счётчика цикла.
...
Рейтинг: 0 / 0
...использование Application.Frequency
    #36614598
SirFisher
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vlth,

да, выдавал ошибку.
и критериальный перебор в данном варианте у меня был не рабочий.
Вот этот вариант уже более-менее

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
Public Function test_Kolmogorova_Smirnova(r1 As Range, R2 As Range)
    'критерий Колмогорова-Смирнова
    'Критерий чувствителен к количеству значений. Для правильных расчетов их должно быть >=50

    Dim min_R1_R2 As Double, max_R1_R2 As Double
    Dim i As Double
    Dim R1_count As Long, R2_count As Long
    Dim freq_R1 As Variant, freq_R2 As Variant, data_r1 As Double
    Dim max_data_R1_R2 As Double, data_R1_R2 As Double
    Dim Krit_KS_temp As Double
    
    With Application.WorksheetFunction
        min_R1_R2 = .Min(r1, R2)
        max_R1_R2 = .Max(r1, R2)
        R1_count = .CountIf(r1, "<>")
        R2_count = .CountIf(R2, "<>")
    
        For i = min_R1_R2 To max_R1_R2
            freq_R1 = .Frequency(r1, Array(i))
            freq_R2 = .Frequency(R2, Array(i))
            data_R1_R2 = freq_R1( 1 ,  1 ) / R1_count - freq_R2( 1 ,  1 ) / R2_count
            If max_data_R1_R2 < data_R1_R2 Then max_data_R1_R2 = data_R1_R2
        Next i
          
        Krit_KS_temp = max_data_R1_R2 * ((R1_count * R2_count) / (R1_count + R2_count)) ^  0 . 5 
        
    'перебираем критериальные значения
        If Krit_KS_temp <  1 . 36  Then test_Kolmogorova_Smirnova = .Text(.Round(Krit_KS_temp,  3 ), "###0.000") & "; p<0.05"
        If Krit_KS_temp >  1 . 36  Then test_Kolmogorova_Smirnova = .Text(.Round(Krit_KS_temp,  3 ), "###0.000") & "; p>0.05"
        If Krit_KS_temp >  1 . 63  Then test_Kolmogorova_Smirnova = .Text(.Round(Krit_KS_temp,  3 ), "###0.000") & "; p>0.01"
        If Krit_KS_temp >  1 . 95  Then test_Kolmogorova_Smirnova = .Text(.Round(Krit_KS_temp,  3 ), "###0.000") & "; p>0.001"
    End With


End Function
...
Рейтинг: 0 / 0
...использование Application.Frequency
    #36614618
SirFisher
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vlthSirFisher, кстати, подумайте над типом переменной i : как-то странно смотрится Double в кач-ве счётчика цикла.

Согласен, странноват. Только приращение не всегда целочисленное, могут быть и десятые. Надеюсь, что сотых и тысячных не будет
...
Рейтинг: 0 / 0
...использование Application.Frequency
    #36614621
Фотография vlth
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SirFisher, тогда надо шаг приращения задавать.
...
Рейтинг: 0 / 0
...использование Application.Frequency
    #36614672
SirFisher
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vlth,

да, это в планах стоит по расширению функционала. Сейчас подбираю методику построения вариационного ряда, вот от нее и буду танцевать с установкой приращения шага
...
Рейтинг: 0 / 0
...использование Application.Frequency
    #36614709
Фотография vlth
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SirFisherИ еще. Каким образом подвесить справку к создаваемой пользовательской функции?Например, у Уокенбаха про создании справки немало информации.
...
Рейтинг: 0 / 0
11 сообщений из 36, страница 2 из 2
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / ...использование Application.Frequency
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]