В качестве приквела к вопросу о линейно-смешанных моделях в R и для использования в качестве справочного материала для любителей статистики начального и среднего уровня, я решил опубликовать в качестве независимого «Q & A-style» шаги, связанные с «ручным» вычислением Коэффициенты и прогнозные значения простой линейной регрессии.
В качестве примера используется встроенный набор данных R mtcars
, и он будет установлен в виде миль на галлон, потребляемых транспортным средством, действующим в качестве независимой переменной, с регрессией на вес автомобиля (непрерывная переменная) и количество цилиндров в виде фактор с тремя уровнями (4, 6 или 8) без взаимодействия.
РЕДАКТИРОВАТЬ: Если вы заинтересованы в этом вопросе, вы обязательно найдете подробный и удовлетворительный ответ в этом посте Мэтью Друри за пределами резюме .
источник
Ответы:
Примечание . Я разместил расширенную версию этого ответа на своем веб-сайте .
Конечно! Вниз по кроличьей норе мы идем.
Первый уровень -
lm
интерфейс, предоставляемый программисту R. Вы можете посмотреть на источник для этого, просто набравlm
на консоли R. Большая часть этого (как и большая часть кода производственного уровня) занята проверкой входных данных, установкой атрибутов объекта и выдачей ошибок; но эта линия торчитlm.fit
это еще одна функция R, вы можете назвать ее самостоятельно. Хотяlm
удобно работать с формулами и фреймом данных,lm.fit
хочет матрицы, так что это один уровень абстракции удаляется. Проверка источникаlm.fit
, более занятая работа и следующая действительно интересная строкаТеперь мы куда-то добираемся.
.Call
способ вызова R в C-код. Где-то есть функция C, C_Cdqrls в источнике R, и нам нужно ее найти. Здесь .Глядя на функцию C, мы снова обнаруживаем в основном проверку границ, очистку от ошибок и занятую работу. Но эта линия отличается
Итак, теперь мы находимся на нашем третьем языке, R назвал C, который вызывает в fortran. Вот код Фортрана .
Первый комментарий говорит обо всем
(интересно, похоже, что название этой подпрограммы было изменено в какой-то момент, но кто-то забыл обновить комментарий). Таким образом, мы, наконец, находимся в точке, где мы можем сделать некоторую линейную алгебру и действительно решить систему уравнений. Это то, в чем действительно хорошо разбирается фортран, и это объясняет, почему мы прошли через так много слоев, чтобы попасть сюда.
Комментарий также объясняет, что будет делать код
Итак, Фортран собирается решить систему, найдя разложениеQ R
Первое, что происходит, и, безусловно, самое важное, это
Это вызывает функцию fortran
dqrdc2
в нашей входной матрицеx
. Что это?Итак, мы наконец-то добрались до linpack . Linpack - это библиотека линейной алгебры Фортрана, которая существует с 70-х годов. Наиболее серьезная линейная алгебра в конечном итоге находит свой путь в linpack. В нашем случае мы используем функцию dqrdc2
Это где фактическая работа сделана. Мне потребовался бы хороший полный день, чтобы понять, что делает этот код, он так же низок, как и они. Но, как правило, у нас есть матрица и мы хотим разложить ее на произведение X = Q R, где Q - ортогональная матрица, а R - верхняя треугольная матрица. Это умная вещь, потому что, получив Q и R, вы можете решить линейные уравнения для регрессии.Икс Икс= Q R Q р Q р
очень легко. Верно
так что вся система становится
но имеет верхнюю треугольную форму и имеет тот же ранг, что и X t X , поэтому, пока наша задача хорошо поставлена, она является полным рангом, и мы можем также просто решить приведенную системур ИксTИкс
Но вот потрясающая вещь. верхняя треугольная, поэтому последнее линейное уравнение здесь просто , поэтому решение для β n тривиально. Затем вы можете пройти вверх по строкам, одну за другой, и подставить в β, которые вы уже знаете, каждый раз, получая простое линейное уравнение с одной переменной для решения. Итак, когда у вас есть Q и R , все это сводится к тому, что называется обратной заменой , что легко. Вы можете прочитать об этом более подробно здесь , где явный маленький пример полностью проработан.р βN β Q р
constant * beta_n = constant
источник
Фактические пошаговые вычисления в R прекрасно описаны в ответе Мэтью Друри в этой же теме. В этом ответе я хочу пройти процесс доказательства себя, что результаты в R на простом примере могут быть достигнуты, следуя линейной алгебре проекций на пространство столбцов и концепции ошибок перпендикулярного (точечного произведения), проиллюстрированной в разных постах. и хорошо объяснено доктором Странгом в « Линейной алгебре и ее приложениях» и легко доступно здесь .
lm
Идентичный:
coef(lm(mpg ~ wt + as.factor(cyl)-1))
.y_hat <- HAT %*% mpg
cyl <- as.factor(cyl); OLS <- lm(mpg ~ wt + cyl); predict(OLS)
:источник
beta = solve(t(X) %*% X, t(X) %*% y)
на практике более точным, чемsolve(t(X) %*% X) %*% t(X) %*% y
.R
для важных вычислений, я хотел бы предложить вам рассмотреть возможность превращения его в вклад в наш блог.