2011-07-27 2 views
0

У меня есть простой матрицу как:Как создать линейную регрессию с R?

 [,1] [,2] [,3] 
[1,] 1 2 3 
[2,] 4 5 6 
[3,] 7 8 9 
[4,] 10 11 12 

я должен вычислить линейную регрессию этих столбцов, как: lm(x ~ y)

Где thefirst колонны является X, а другие являются Y? Я имею в виду ... я могу сделать что-то, чтобы использовать другой с один переменной (у)

или

делать я должен использовать что-то вроде: lm(x~y+z+c+b) и т.д. и т.п.?

Спасибо

ответ

4

Да, но я бы не рекомендовал его:

> set.seed(2) 
> mat <- matrix(runif(12), ncol = 3, byrow = TRUE) 
> mat 
      [,1]  [,2]  [,3] 
[1,] 0.1848823 0.7023740 0.5733263 
[2,] 0.1680519 0.9438393 0.9434750 
[3,] 0.1291590 0.8334488 0.4680185 
[4,] 0.5499837 0.5526741 0.2388948 
> mod <- lm(mat[,1] ~ mat[,-1]) 
> mod 

Call: 
lm(formula = mat[, 1] ~ mat[, -1]) 

Coefficients: 
(Intercept) mat[, -1]1 mat[, -1]2 
    1.0578  -1.1413  0.1177 

Почему это не рекомендуется? Ну, вы злоупотребляете интерфейсом формул здесь; он работает, но коэффициенты модели имеют нечетные имена, и вы накладываете много накладных расходов на работу с интерфейсом формулы, который предназначен для извлечения ответов/ковариаций из фрейма данных или объекта списка, на который делается ссылка в символической формуле.

Обычный способ работы является:

df <- data.frame(mat) 
names(df) <- c("Y","A","B") 
## specify all terms: 
lm(Y ~ A + B, data = df) 
## or use the `.` shortcut 
lm(Y ~ ., data = df) 

Если вы не хотите идти через кадр данных, то вы можете вызвать функцию лошадки за lm(), lm.fit(), непосредственно с помощью простой операции:

здесь мы связываем от вектора 1s до графах 2 и 3 mat (cbind(rep(1, nrow(mat)), mat[,-1])); это модельная матрица. mat[, 1] - ответ. Хотя он не возвращает класс "lm", он будет очень быстрым и может быть легко преобразован в один, если это имеет значение.

Кстати, у вас есть обычные обозначения спереди. Y обычно является ответом, при этом X указывает на ковариаты, используемые для моделирования или прогнозирования Y.

+0

выглядит очень хорошо, почему вы его не raccomend? – Dail

+0

@Dail 'lm()' - это высокоуровневый интерфейс для кода нижнего уровня. Большая часть кишки 'lm()' заключается в обработке формулы для построения матрицы модели и извлечения ответа. В вашем случае у вас почти есть матрица модели, а ответ и простая манипуляция получают полную матрицу модели (см. Мой обновленный ответ), поэтому при вызове 'lm()' с матрицей вы вызываете в основном избыточный код, когда можете позвонить 'lm.fit()' непосредственно. Зависит от того, что вы хотите сделать с моделью, как только вы ее получите. –

+0

безупречный! хорошо имеет смысл! Спасибо – Dail

Смежные вопросы