Как функция lm R обрабатывает уровни факторов (в C_Cdqrls?)? - PullRequest
5 голосов
/ 09 июля 2019

Или другими словами: какой алгоритм используется в этом случае?Я предполагаю, что они используют дискриминантный анализ, как описано, например, в главе 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 : Часть вопроса также можно найти здесь

1 Ответ

0 голосов
/ 23 июля 2019

С помощью ответов на на этот вопрос я понял, что ответ прост:

Если факторы относятся к переменным (переменная-предиктор), model.matrix просто увеличивается. Таким образом, ясно, что C_Cdqrls может обрабатывать матрицу модели.

Только если зависимая (ые) переменная (и) содержит факторы, линейная регрессия или lm не работает должным образом, и возможен дискриминантный анализ. (На первый взгляд кажется, что stats::glm использует модель логита.

Из Википедия :

Анализ дискриминантной функции очень похож на логистическую регрессию, и оба могут быть использованы для ответа на одни и те же вопросы исследования. Логистическая регрессия не имеет столько предположений и ограничений как дискриминантный анализ. Однако, когда дискриминантный анализ предположения выполнены, это более мощный, чем логистическая регрессия. В отличие от логистической регрессии, дискриминантный анализ может быть использован с малые размеры выборки. Было показано, что когда размеры выборки равный и имеет место однородность дисперсии / ковариации, дискриминант анализ более точный. Учитывая все это, логистика регрессия стала общим выбором, так как предположения дискриминантный анализ встречается редко.


* * Пример тысяча двадцать-один: * * 1 022
x <- seq(0, 10, length.out = 21)
y <- c(0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
y <- as.factor(y)
df <- data.frame(x = x, y = y)

# see ??numeric and the ‘Warning’ section in factor:
plot(x, as.numeric(levels(y))[y], ylim = c(0, 1.2))

fit <- lm(y ~ x, data = df)
print(summary(fit))

fit_glm <- stats::glm(y ~ x, family = binomial(link = "logit"), data = df, control = list(maxit = 50))
print(summary(fit_glm))

df$glm.probs <- stats::predict(fit_glm, newdata = df, type = "response")
df$glm.pred = ifelse(glm.probs > 0.5, 1, 0)
points(x, df$glm.pred + 0.05, col = "red")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...