SE меняются при масштабировании переменных в multinom?
В модели многоклассовой логистической регрессии с nnet::multinom изменение масштаба предиктора приводит к смещению стандартных ошибок и p‑значений из‑за чувствительности численного Гессиана. Узнайте почему и как сохранить стабильность.
Почему стандартные ошибки и p‑значения меняются, когда я масштабирую предиктор в многоклассовой логистической регрессии с помощью nnet::multinom в 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на самом деле - 2. Почему масштабирование меняет стандартные ошибки в R
- 3. Как SPSS ведёт себя иначе
- 4. Практические способы получить масштаб‑инвариантные выводы
- 5. Итоги и лучшие практики
1. Что делает multinom на самом деле
multinom подгоняет многоклассовую логистическую регрессию, минимизируя отрицательную логарифмическую правдоподобность с помощью оптимизатора в стиле нейронной сети (nnet).
Ключевые моменты из документации пакета:
- Функция нормализует матрицу дизайна в диапазон [0, 1], чтобы избежать медленной сходимости и численной нестабильности【nnet‑docs】.
- По умолчанию
Hess = TRUEинициирует вычисление наблюдаемой матрицы Фишера (гессиана) в финальной оценке.
Обратная матрица этого гессиана даёт оценки стандартных ошибок для каждого коэффициента.
Таким образом, стандартные ошибки получаются из кривизны поверхности правдоподобия в точке оптимума, и эта кривизна сильно чувствительна к численному масштабу предикторов.
2. Почему масштабирование меняет стандартные ошибки в R
2.1 Математика: коэффициенты и масштаб
Если вы умножаете предиктор на постоянную , коэффициент логарифмических шансов меняется на .
Статистика Вальда оставалась бы неизменной если бы стандартная ошибка была точно пропорциональна величине коэффициента.
В теории это должно работать, но на практике:
- Масштабирование гессиана: Гессиан вычисляется численно на несокращённых предикторах. При масштабировании элементы гессиана меняются, и его обратная (матрица ковариаций) меняется не пропорционально .
- Алгоритмические пороги: Оптимизатор использует относительные пороги (например,
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‑тестов
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. Итоги и лучшие практики
- Понимайте, что сама модель инвариантна к масштабу; только численная оценка стандартных ошибок зависит от масштабирования.
- Стандартизируйте или нормализуйте предикторы перед подгонкой, если хотите стабильные коэффициенты и SE.
- Предпочитайте тесты отношения правдоподобия для вывода, когда нужны p‑значения, устойчивые к масштабированию.
- Используйте пакеты вроде
mlogitдля готовой поддержки масштаб‑инвариантных выводов. - Воспринимайте различия между R и SPSS как следствие разных алгоритмов – это не ошибка ни в одном из программ.
Следуя этим рекомендациям, вы избежите вводящих в заблуждение смещений стандартных ошибок и p‑значений, обеспечив надёжность и понятность результатов многоклассовой логистической регрессии независимо от того, как вы масштабируете предикторы.