Published on

January 1, 2025

Понимание теста знаковых рангов Вилкоксона в SQL Server

Тест знаковых рангов Вилкоксона – это статистический тест, который часто используется данными учеными для оценки, являются ли сопоставленные измерения набора сущностей значимо различными друг от друга. В этой статье мы рассмотрим концепцию теста знаковых рангов Вилкоксона и способы его реализации с использованием T-SQL в SQL Server.

Обзор теста знаковых рангов Вилкоксона

Тест знаковых рангов Вилкоксона является одним из двух широко рекомендуемых статистических тестов для оценки, являются ли два повторных измерения на выборке сущностей статистически различными. Другой широко рекомендуемый тест – это t-тест для сопоставленных измерений. Основное отличие между этими двумя тестами заключается в том, что t-тест предполагает, что различия происходят из популяции нормально распределенных различий, в то время как тест знаковых рангов Вилкоксона не требует этого предположения.

Тест знаковых рангов Вилкоксона работает с набором сопоставленных измерений. Он требует, чтобы для каждой сущности выборки было выполнено два измерения из одной и той же популяции. Измерения должны быть для непрерывной переменной, даже если они отчетливо отражены только до ближайшего целого числа. Разница между измерениями для каждой пары должна иметь свойства порядковой шкалы, что означает, что имеет смысл говорить о различиях в измерениях как о больших, равных или меньших друг относительно друга. Кроме того, разница между измерениями для каждой пары не должна быть равна 0, так как разница 0 не дает информации о том, какое измерение больше – первое или второе.

Тест знаковых рангов Вилкоксона присваивает ранговые значения различиям сопоставленных измерений на основе их величины и знака. Сумма знаковых рангов может быть интерпретирована как значение в нормальном распределении, что позволяет оценить статистическую значимость.

Реализация теста знаковых рангов Вилкоксона в T-SQL

Для реализации теста знаковых рангов Вилкоксона в T-SQL можно использовать следующие шаги:

  1. Создайте таблицу для хранения сопоставленных измерений.
  2. Заполните таблицу данными для сопоставленных измерений.
  3. Вычислите абсолютные различия для каждой пары измерений.
  4. Вычислите знаковые ранговые значения на основе абсолютных различий.
  5. Вычислите сумму знаковых рангов и стандартное отклонение.
  6. Вычислите значение z для суммы знаковых рангов.
  7. Сравните вычисленное значение z с критическими значениями z для разных уровней значимости, чтобы оценить статистическую значимость.

Вот пример кода T-SQL, демонстрирующий реализацию теста знаковых рангов Вилкоксона:

use DataScience

-- создание и заполнение новой таблицы data_for_Wilcoxon_test
drop table if exists data_for_Wilcoxon_test
create table data_for_Wilcoxon_test (
    comp_id varchar(10) not null,
    apply1_result real not null,
    apply2_result real not null
)

-- заполнение таблицы data_for_Wilcoxon_test данными для теста
insert into data_for_Wilcoxon_test values
    ('comp_1', 78, 78),
    ('comp_2', 24, 24),
    ('comp_3', 64, 62),
    ('comp_4', 45, 48),
    ('comp_5', 64, 68),
    ('comp_6', 52, 56),
    ('comp_7', 30, 25),
    ('comp_8', 50, 44),
    ('comp_9', 64, 56),
    ('comp_10', 50, 40),
    ('comp_11', 78, 68),
    ('comp_12', 22, 36),
    ('comp_13', 84, 68),
    ('comp_14', 40, 20),
    ('comp_15', 90, 58),
    ('comp_16', 72, 32)

-- вычисление абсолютных различий для каждой пары измерений
select 
    comp_id,
    apply1_result,
    apply2_result,
    (apply1_result - apply2_result) as difference,
    sign(apply1_result - apply2_result) as sign_for_difference,
    abs(apply1_result - apply2_result) as abs_difference
from data_for_Wilcoxon_test

-- вычисление знаковых ранговых значений на основе абсолютных различий
select 
    Wilcoxon_differences.*,
    unsigned_rank.unsigned_rank,
    (Wilcoxon_differences.sign_for_difference * unsigned_rank.unsigned_rank) as signed_rank
from (
    select 
        comp_id,
        apply1_result,
        apply2_result,
        (apply1_result - apply2_result) as difference,
        sign(apply1_result - apply2_result) as sign_for_difference,
        abs(apply1_result - apply2_result) as abs_difference
    from data_for_Wilcoxon_test
) Wilcoxon_differences
join (
    select 
        abs_difference,
        avg(rownumber) as unsigned_rank
    from (
        select 
            abs_difference,
            rownumber
        from (
            select 
                abs(apply1_result - apply2_result) as abs_difference,
                cast(row_number() over (order by abs(apply1_result - apply2_result)) as float) as rownumber
            from data_for_Wilcoxon_test
        ) for_avg_rownumber
        group by abs_difference, rownumber
    ) for_avg_rownumber
    group by abs_difference
) unsigned_rank
on Wilcoxon_differences.abs_difference = unsigned_rank.abs_difference

-- вычисление суммы знаковых рангов, стандартного отклонения и значения z
declare @n int, @sum int
select @n = count(signed_rank), @sum = sum(signed_rank)
from (
    select 
        Wilcoxon_differences.*,
        unsigned_rank.unsigned_rank,
        (Wilcoxon_differences.sign_for_difference * unsigned_rank.unsigned_rank) as signed_rank
    from (
        select 
            comp_id,
            apply1_result,
            apply2_result,
            (apply1_result - apply2_result) as difference,
            sign(apply1_result - apply2_result) as sign_for_difference,
            abs(apply1_result - apply2_result) as abs_difference
        from data_for_Wilcoxon_test
    ) Wilcoxon_differences
    join (
        select 
            abs_difference,
            avg(rownumber) as unsigned_rank
        from (
            select 
                abs_difference,
                rownumber
            from (
                select 
                    abs(apply1_result - apply2_result) as abs_difference,
                    cast(row_number() over (order by abs(apply1_result - apply2_result)) as float) as rownumber
                from data_for_Wilcoxon_test
            ) for_avg_rownumber
            group by abs_difference, rownumber
        ) for_avg_rownumber
        group by abs_difference
    ) unsigned_rank
    on Wilcoxon_differences.abs_difference = unsigned_rank.abs_difference
) for_@n_and_@sum

-- вычисление значения z для суммы знаковых рангов
select 
    @sum as W,
    @n as N,
    sqrt((@n * (@n + 1) * (2 * @n + 1)) / 6) as [стандартное отклонение знаковых рангов],
    case 
        when @sum > 0 then (@sum - 0.5) / sqrt((@n * (@n + 1) * (2 * @n + 1)) / 6)
        else (@sum + 0.5) / sqrt((@n * (@n + 1) * (2 * @n + 1)) / 6)
    end as [z для суммы знаковых рангов]

Следуя этим шагам и выполняя код T-SQL, вы можете вычислить статистику теста знаковых рангов Вилкоксона и оценить ее статистическую значимость для ваших сопоставленных измерений.

Заключение

Тест знаковых рангов Вилкоксона является ценным статистическим тестом для оценки, являются ли сопоставленные измерения набора сущностей значимо различными друг от друга. Реализуя тест знаковых рангов Вилкоксона в T-SQL, вы можете анализировать ваши сопоставленные измерения и определить их статистическую значимость. Понимание теста знаковых рангов Вилкоксона и его реализация в SQL Server могут расширить ваши возможности анализа данных и предоставить ценные идеи о ваших данных.

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.