# Моделирование — краткий справочник > Неочевидное поведение, подводные камни и непростые значения по умолчанию функций R. > Только то, чего Claude ещё не знает. --- ## formula Подводные камни символьного задания модели. - `I()` необходима для буквального использования арифметических операторов: `y ~ x + I(x^2)`. Без `I()` оператор `^` означает комбинации взаимодействий. - `*` = главные эффекты + взаимодействие: `a*b` разворачивается в `a + b + a:b`. - `(a+b+c)^2` = все главные эффекты + все двухфакторные взаимодействия (не возведение в квадрат). - `-` удаляет члены: `(a+b+c)^2 - a:b` исключает только взаимодействие `a:b`. - `/` означает вложенность: `a/b` = `a + b %in% a` = `a + a:b`. - `.` в формуле означает «все остальные столбцы данных» (в контексте `terms.formula`) или «предыдущее содержимое» (в `update.formula`). - Объекты формул содержат **окружение**, используемое для поиска переменных; `as.formula("y ~ x")` использует `parent.frame()`. --- ## terms / model.matrix - `model.matrix` создаёт матрицу плана, включая кодирование фиктивными переменными. Контрасты по умолчанию: `contr.treatment` для неупорядоченных факторов, `contr.poly` для упорядоченных. - Атрибуты объекта `terms`: `order` (порядок взаимодействия для каждого члена), `intercept`, матрица `factors`. - Имена столбцов из `model.matrix` могут быть неожиданными: например, конкатенация `factorLevelName`. --- ## glm - По умолчанию `family = gaussian(link = "identity")` — `glm()` без `family` незаметно строит OLS-модель (то же, что `lm`, но медленнее и с выводом на основе девианса). - Распространённые семейства: `binomial(link = "logit")`, `poisson(link = "log")`, `Gamma(link = "inverse")`, `inverse.gaussian()`. - `binomial` принимает отклик в виде: вектора 0/1, логических значений, фактора (второй уровень = успех) или матрицы с 2 столбцами `cbind(success, failure)`. - `weights` в `glm` означает **априорные веса** (не частотные веса) — для частотных весов используйте приём с cbind или offset. - `predict.glm(type = "response")` — для предсказанных вероятностей; по умолчанию `type = "link"` возвращает логарифм шансов (для логистической модели) или логарифм интенсивности (для модели Пуассона). - `anova(glm_obj, test = "Chisq")` — для тестов на основе девианса; `"F"` недопустим для негауссовых семейств. - Квазисемейства (`quasibinomial`, `quasipoisson`) допускают сверхдисперсию — AIC не вычисляется. - Сходимость: `control = glm.control(maxit = 100)`, если стандартных 25 итераций недостаточно. --- ## aov - `aov` — обёртка над `lm`, сохраняющая дополнительную информацию для сбалансированного ANOVA. Для несбалансированных планов вычисляются SS типа I (последовательные) — порядок членов важен. - Для SS типа III используйте `car::Anova()` или установите контрасты `contr.sum`/`contr.helmert`. - Страты ошибки для повторных измерений: `aov(y ~ A*B + Error(Subject/B))`. - `summary.aov` выдаёт таблицу ANOVA; `summary.lm(aov_obj)` — сводку в стиле регрессии. --- ## nls - Требует **хороших начальных значений** в `start = list(...)`, иначе сходимость не достигается. - Самозапускающиеся модели (`SSlogis`, `SSasymp` и т. д.) автоматически вычисляют начальные значения. - Алгоритм `"port"` допускает ограничения параметров (`lower`/`upper`). - Если данные описываются слишком точно (нет остаточного шума), проверка сходимости не проходит — используйте `control = list(scaleOffset = 1)` или добавьте небольшой случайный шум к данным. - Аргумент `weights` — для взвешенного NLS; `na.action` — для обработки пропущенных значений. --- ## step / add1 - `step` выполняет **пошаговый** выбор модели по AIC (по умолчанию). Используйте `k = log(n)` для BIC. - Направление: `direction = "both"` (по умолчанию), `"forward"` или `"backward"`. - `add1`/`drop1` оценивают добавления/удаления одного члена; `step` вызывает их итеративно. - Аргумент `scope` задаёт верхнюю/нижнюю границы модели для поиска. - `step` изменяет объект модели непосредственно — может работать медленно для больших моделей с множеством потенциальных членов. --- ## predict.lm / predict.glm - `predict.lm` с `interval = "confidence"` даёт доверительный интервал для **среднего** отклика; `interval = "prediction"` даёт предиктивный интервал для **нового наблюдения** (более широкий). - `newdata` должен содержать столбцы, соответствующие переменным исходной формулы; факторы должны иметь те же уровни. - `predict.glm` с `type = "response"` выдаёт прогнозы в шкале отклика (например, вероятности для логистической модели); `type = "link"` (по умолчанию) — в шкале функции связи. - `se.fit = TRUE` возвращает стандартные ошибки; для `predict.glm` они задаются в шкале **функции связи** независимо от `type`. - `predict.lm` с `type = "terms"` возвращает вклад каждого члена. --- ## loess - `span` управляет гладкостью (по умолчанию 0.75). Span < 1 использует такую долю точек; span > 1 использует все точки с скорректированным расстоянием. - Максимум **4 предиктора**. Использование памяти приблизительно **квадратично** по n (1000 точек ~ 10MB). - `degree = 0` (локальная константа) допускается, но плохо протестировано — используйте осторожно. - Не идентична `loess` из S; обусловливание не реализовано. - `normalize = TRUE` (по умолчанию) стандартизирует предикторы к общей шкале; для пространственных координат задавайте `FALSE`. --- ## lowess в сравнении с loess - `lowess` — более старая функция; возвращает `list(x, y)` — не позволяет прогнозировать в новых точках. - `loess` — более новый интерфейс формул с методом `predict`. - Параметр `lowess` — `f` (span, по умолчанию 2/3); параметр `loess` — `span` (по умолчанию 0.75). - Для `lowess` значение `iter` по умолчанию равно 3 (итерации повышения робастности); для `loess` по умолчанию `family = "gaussian"` (без робастности). --- ## smooth.spline - По умолчанию параметр сглаживания выбирается через **GCV** (обобщённую перекрёстную проверку). - `cv = TRUE` вместо этого использует обычную перекрёстную проверку с исключением одного наблюдения — не используйте при повторяющихся значениях x. - `spar` и `lambda` управляют гладкостью; `df` может задавать эквивалентное число степеней свободы. - Возвращает объект с методами `predict`, `print`, `plot`. Компонент `fit` содержит узлы и коэффициенты. --- ## optim - По умолчанию **минимизирует**. Для максимизации задайте `control = list(fnscale = -1)`. - Метод по умолчанию — Нелдера — Мида (без градиентов, устойчивый, но медленный). Плохо подходит для одномерных задач — используйте `"Brent"` или `optimize()`. - `"L-BFGS-B"` — единственный метод, поддерживающий прямоугольные ограничения (`lower`/`upper`). Задание границ автоматически выбирает этот метод с предупреждением. - `"SANN"` (имитация отжига): код сходимости **всегда 0** — он никогда не «завершается неудачей». `maxit` = общее число вычислений функции (по умолчанию 10000), другого критерия остановки нет. - `parscale`: масштабируйте параметры так, чтобы изменение каждого на единицу давало сопоставимое изменение целевой функции. Критически важно для задач с разными масштабами. - `hessian = TRUE`: возвращает численный гессиан задачи **без ограничений**, даже если прямоугольные ограничения активны. - `fn` может возвращать `NA`/`Inf` (кроме `"L-BFGS-B"`, который всегда требует конечных значений). Начальное значение должно быть конечным. --- ## optimize / uniroot - `optimize`: одномерная минимизация на ограниченном интервале. Возвращает `minimum` и `objective`. - `uniroot`: находит корень `f` в `[lower, upper]`. **Требует**, чтобы `f(lower)` и `f(upper)` имели противоположные знаки. - `uniroot` с `extendInt = "yes"` может автоматически расширять интервал для поиска смены знака — но может находить ложные корни у функций, которые на самом деле не пересекают ноль. - `nlm`: минимизатор ньютоновского типа. Градиент/гессиан задаются как **атрибуты** возвращаемого `fn` значения (необычный интерфейс). --- ## TukeyHSD - Требует обученный объект `aov` (не `lm`). - По умолчанию `conf.level = 0.95`. Возвращает скорректированные p-значения и доверительные интервалы для всех попарных сравнений. - Имеет смысл только для **сбалансированных** или почти сбалансированных планов; для сильно несбалансированных данных может быть излишне либеральным. --- ## anova (для lm) - `anova(model)`: последовательные SS (тип I) — **порядок членов важен**. - `anova(model1, model2)`: F-тест для сравнения вложенных моделей. - Для SS типа II или III используйте `car::Anova()`.