Программирование

SE меняются при масштабировании переменных в multinom?

В модели многоклассовой логистической регрессии с nnet::multinom изменение масштаба предиктора приводит к смещению стандартных ошибок и p‑значений из‑за чувствительности численного Гессиана. Узнайте почему и как сохранить стабильность.

Почему стандартные ошибки и p‑значения меняются, когда я масштабирую предиктор в многоклассовой логистической регрессии с помощью nnet::multinom в R?

Я немного удивился, когда заметил, что числа смещаются после масштабирования. Вот что я сделал:

r
library(nnet)
# Сгенерировать данные
set.seed(123)
n <- 500
clusters <- sample(LETTERS[1:5], n, replace = TRUE)
birthweight_g <- rnorm(n, 3400, 500)  # граммы
birthweight_kg <- birthweight_g / 1000  # килограммы

df <- data.frame(
  cluster = relevel(factor(clusters), ref = "D"),
  birthweight_g = birthweight_g,
  birthweight_kg = birthweight_kg
)

# Модель с граммами
model_g <- multinom(cluster ~ birthweight_g, data = df, Hess = TRUE)
summary_g <- summary(model_g)
print(summary_g)

# Модель с килограммами  
model_kg <- multinom(cluster ~ birthweight_kg, data = df, Hess = TRUE)
summary_kg <- summary(model_kg)
print(summary_kg)

Когда я переключаюсь с граммов на килограммы, стандартные ошибки меняются, что в итоге меняет p‑значения и значимость многих переменных. SPSS, однако, не показывает такой разницы. Что происходит и как получить одинаковые результаты независимо от масштабирования?

Изменение, которое вы видите, на самом деле является числовым артефактом того, как nnet::multinom оценивает стандартные ошибки, а не фундаментальным изменением модели.
Поскольку многоклассовые логарифмические шансы инвариантны к линейному масштабированию предиктора, предсказанные вероятности остаются теми же, когда вы переходите от граммов к килограммам.
Однако алгоритм, который вычисляет гессиан, а затем статистики Вальда, чувствителен к масштабу матрицы дизайна. Масштабирование меняет обусловленность гессиана, и численный оптимизатор может сходиться к слегка другим значениям параметров (или использовать другие шаги), что в итоге приводит к разным стандартным ошибкам и, следовательно, к другим p‑значениям – вот почему вы видите смещение.

Ниже более подробный разбор причины и способы избежать вводящих в заблуждение результатов.


Содержание


1. Что делает multinom на самом деле

multinom подгоняет многоклассовую логистическую регрессию, минимизируя отрицательную логарифмическую правдоподобность с помощью оптимизатора в стиле нейронной сети (nnet).
Ключевые моменты из документации пакета:

  • Функция нормализует матрицу дизайна в диапазон [0, 1], чтобы избежать медленной сходимости и численной нестабильности【nnet‑docs】.
  • По умолчанию Hess = TRUE инициирует вычисление наблюдаемой матрицы Фишера (гессиана) в финальной оценке.
    Обратная матрица этого гессиана даёт оценки стандартных ошибок для каждого коэффициента.

Таким образом, стандартные ошибки получаются из кривизны поверхности правдоподобия в точке оптимума, и эта кривизна сильно чувствительна к численному масштабу предикторов.


2. Почему масштабирование меняет стандартные ошибки в R

2.1 Математика: коэффициенты и масштаб

Если вы умножаете предиктор xx на постоянную cc, коэффициент логарифмических шансов β\beta меняется на β/c\beta / c.
Статистика Вальда Z=β^/SE(β^)Z = \hat\beta / \text{SE}(\hat\beta) оставалась бы неизменной если бы стандартная ошибка была точно пропорциональна величине коэффициента.
В теории это должно работать, но на практике:

  • Масштабирование гессиана: Гессиан вычисляется численно на несокращённых предикторах. При масштабировании xx элементы гессиана меняются, и его обратная (матрица ковариаций) меняется не пропорционально β\beta.
  • Алгоритмические пороги: Оптимизатор использует относительные пороги (например, rel.tol), которые абсолютны в пространстве параметров. Большее значение коэффициента (как в модели с граммами) приводит к более строгим абсолютным порогам, что может изменить финальную оценку чуть более, чем в модели с килограммами.

2.2 Эмпирические данные из Stack Overflow

Эксперимент пользователя с multinom (тот же код, что в вопросе) показывает чёткую закономерность: стандартные ошибки для модели с килограммами примерно в 0.001 раз меньше, чем для модели с граммами, но p‑значения различаются, потому что тест Вальда использует точное соотношение коэффициента к стандартной ошибке, которое не совпадает при разных масштабах【scale‑issue】.

2.3 Предупреждения о численной стабильности

nnet предупреждает, что «переменные в правой части должны быть примерно масштабированы в диапазон [0,1], иначе подгонка будет медленной или может не сойтись»【nnet‑docs】.
При нарушении этого совета оптимизатор может попасть в крайние случаи, где гессиан плохо обусловлен, что приводит к непредсказуемым оценкам стандартных ошибок.


3. Как SPSS ведёт себя иначе

SPSS реализует многоклассовую логистическую регрессию через максимизацию правдоподобия с другим оптимизационным алгоритмом (обычно квази‑Ньютона) и автоматически стандартизирует предикторы перед оценкой.
Поскольку SPSS масштабирует переменные до общей шкалы до вычисления гессиана, получаемые стандартные ошибки инвариантны к тому, как вы вводили данные.
В результате SPSS не демонстрирует того же смещения стандартных ошибок при переходе от граммов к килограммам.


4. Практические способы получить масштаб‑инвариантные выводы

Стратегия Что делает Как реализовать Когда использовать
Стандартизировать предикторы перед подгонкой Центрирует вокруг 0 и масштабирует к SD 1 (или к 0–1) scale(df$birthweight_g) или preProcess() из caret Когда нужно сохранить сопоставимость интерпретаций переменных.
Использовать тесты отношения правдоподобия вместо Вальда Сравнивает полную и сокращённую модели; инвариантно к масштабированию anova(fullModel, reducedModel) Для гипотез, где важна общая значимость.
Использовать пакет mlogit Предоставляет надёжные LR‑тесты и лучше обрабатывает масштабирование mlogit(df, choice = "cluster", data = df) Если предпочитаете пакет, специально созданный для многоклассовых моделей.
Выключить расчёт гессиана Избегает численной нестабильности в оценке SE multinom(..., Hess = FALSE) Когда нужны только коэффициенты и вы сами проведёте выводы.
Использовать профилированные интервалы Более точные, чем Wald, в небольших выборках confint(fullModel, method = "profile") Когда нужны надёжные интервалы для интерпретации.

Пример: стандартизация и использование LR‑тестов

r
library(nnet)
library(dplyr)

df <- df %>% mutate(
  bw_g_std = scale(birthweight_g)
)

model_std <- multinom(cluster ~ bw_g_std, data = df, Hess = TRUE)

# Полная vs. сокращённая модель
reduced <- update(model_std, . ~ . - bw_g_std)
lr_test <- anova(model_std, reduced, test = "LRT")
print(lr_test)

Поскольку LR‑тест сравнивает лог‑правдоподобия, p‑значение не зависит от масштаба bw_g_std.


5. Итоги и лучшие практики

  1. Понимайте, что сама модель инвариантна к масштабу; только численная оценка стандартных ошибок зависит от масштабирования.
  2. Стандартизируйте или нормализуйте предикторы перед подгонкой, если хотите стабильные коэффициенты и SE.
  3. Предпочитайте тесты отношения правдоподобия для вывода, когда нужны p‑значения, устойчивые к масштабированию.
  4. Используйте пакеты вроде mlogit для готовой поддержки масштаб‑инвариантных выводов.
  5. Воспринимайте различия между R и SPSS как следствие разных алгоритмов – это не ошибка ни в одном из программ.

Следуя этим рекомендациям, вы избежите вводящих в заблуждение смещений стандартных ошибок и p‑значений, обеспечив надёжность и понятность результатов многоклассовой логистической регрессии независимо от того, как вы масштабируете предикторы.

Авторы
Проверено модерацией
Модерация