Или другими словами: какой алгоритм используется в этом случае?Я предполагаю, что они используют дискриминантный анализ, как описано, например, в главе 4.4.в Джеймс и др.и др.«Введение в статистическое обучение с приложениями в R»?
После ввода комментариев я мог бы также сформулировать вопрос следующим образом:
- первая часть магии появляется в
ans <- .External2(C_modelmatrix, t, data)
(в model.matrix.default
), где модель изменяется в соответствии с уровнями факторов => Я думаю, что понимаю эту часть. - Вторая часть все еще включает
z <- .Call(C_Cdqrls, x, y, tol, FALSE)
, и я не ожидал,что линейная регрессия и дискриминантный анализ одинаковы на уровне математики. Я что-то упускаю из виду ?Опять же, мой stats
пакет является бинарным, у меня нет доступа к исходному коду ...
Я нашел довольно полезные объяснения в этой статье , но в некоторыхукажи только состояния
... Эта [фактор] деконструкция может быть сложной задачей, поэтому мы не будем вдаваться в подробности, чтобы она не забрала нас слишком далеко ...
Я не смог ничего найти в документации и не смог понять, что происходит, используя debug(lm)
Что я понимаю, используя воспроизводимый пример:
n <- 10
p <- 6
set.seed(1)
x <- seq(0, 20, length.out = n) + rnorm(n, 0, 1)
y <- c(1:3)
y <- sample(y, n, replace = TRUE)
z <- 10*y*x + 10*y + 10 + rnorm(n, 0, 1)
debug(lm)
fit <- lm(z ~ x*y)
После mt <- attr(mf, "terms")
это выглядит как
mt
# ...
# attr(,"dataClasses")
# z x y
# "numeric" "numeric" "numeric"
тогда как после
n <- 10
p <- 6
set.seed(1)
x <- seq(0, 20, length.out = n) + rnorm(n, 0, 1)
y <- c(1:3)
y <- sample(y, n, replace = TRUE)
z <- 10*y*x + 10*y + 10 + rnorm(n, 0, 1)
y <- as.factor(y)
debug(lm)
fit <- lm(z ~ x*y)
и mt <- attr(mf, "terms")
выглядит как
mt
# ...
# attr(,"dataClasses")
# z x y
# "numeric" "numeric" "factor"
Но тогда кажется, что они всегда вызывают lm.fit(x, y, offset = offset, singular.ok = singular.ok, ...)
и там z <- .Call(C_Cdqrls, x, y, tol, FALSE)
который я думал только работает без факторов.Ссылка выше хорошо объясняет все, вплоть до матричной модели и qr-декомпозиции, которая, как я думал, не работает в случае факторов.
Edit : матрица модели после x <- model.matrix(mt, mf, contrasts)
уже отличается.В случае чисел
x
(Intercept) x y x:y
1 1 -0.6264538 3 -1.879361
2 1 2.4058655 1 2.405866
3 1 3.6088158 2 7.217632
4 1 8.2619475 1 8.261947
5 1 9.2183967 1 9.218397
6 1 10.2906427 2 20.581285
7 1 13.8207624 1 13.820762
8 1 16.2938803 2 32.587761
9 1 18.3535591 3 55.060677
10 1 19.6946116 2 39.389223
attr(,"assign")
[1] 0 1 2 3
В случае факторов
x
(Intercept) x y2 y3 x:y2 x:y3
1 1 -0.6264538 0 1 0.000000 -0.6264538
2 1 2.4058655 0 0 0.000000 0.0000000
3 1 3.6088158 1 0 3.608816 0.0000000
4 1 8.2619475 0 0 0.000000 0.0000000
5 1 9.2183967 0 0 0.000000 0.0000000
6 1 10.2906427 1 0 10.290643 0.0000000
7 1 13.8207624 0 0 0.000000 0.0000000
8 1 16.2938803 1 0 16.293880 0.0000000
9 1 18.3535591 0 1 0.000000 18.3535591
10 1 19.6946116 1 0 19.694612 0.0000000
attr(,"assign")
[1] 0 1 2 2 3 3
attr(,"contrasts")
attr(,"contrasts")$`y`
[1] "contr.treatment"
Изменить 2 : Часть вопроса также можно найти здесь