2013-09-22 3 views
5

У меня есть набор данных (фрейм данных) с 5 столбцами, содержащими числовые значения.Выполнение нескольких простых линейных регрессий из dataframe в R

Я ищу для простой простой регрессии для каждой пары в наборе данных.

Например, если столбцы были названы A, B, C, D, E, я хочу запустить lm(A~B), lm(A~C), lm(A~D), ...., lm(D~E), ... и затем я хочу построить данные для каждой пары вместе с линией регрессии.

Я довольно новичок в R, поэтому я как бы откручиваю свои колеса от того, как это сделать. Должен ли я использовать ddply? или lapply? Я не совсем уверен, как справиться с этим.

+0

Добро пожаловать на SO. Вы можете использовать 'combn' из cols и' apply' функции для вашей проблемы – Metrics

+1

Пожалуйста, включите минимальный, [воспроизводимый пример] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r -reproducible-пример/5963610 # 5963610). Благодарю. – Henrik

+1

Извините, я пытался включить данные вместе с кодом, но он не показывал, что он будет публиковать правильно (я также новичок в SO). – mrp

ответ

6

Вот одно решение, используя combn

combn(names(DF), 2, function(x){lm(DF[, x])}, simplify = FALSE) 

Пример:

set.seed(1) 
DF <- data.frame(A=rnorm(50, 100, 3), 
       B=rnorm(50, 100, 3), 
       C=rnorm(50, 100, 3), 
       D=rnorm(50, 100, 3), 
       E=rnorm(50, 100, 3)) 

Обновлено: добавление @Henrik предложение (см комментарии)

# only the coefficients 
> results <- combn(names(DF), 2, function(x){coefficients(lm(DF[, x]))}, simplify = FALSE) 
> vars <- combn(names(DF), 2) 
> names(results) <- vars[1 , ] # adding names to identify variables in the reggression 
> results 
$A 
(Intercept)   B 
103.66739418 -0.03354243 

$A 
(Intercept)   C 
97.88341555 0.02429041 

$A 
(Intercept)   D 
122.7606103 -0.2240759 

$A 
(Intercept)   E 
99.26387487 0.01038445 

$B 
(Intercept)   C 
99.971253525 0.003824755 

$B 
(Intercept)   D 
102.65399702 -0.02296721 

$B 
(Intercept)   E 
96.83042199 0.03524868 

$C 
(Intercept)   D 
80.1872211 0.1931079 

$C 
(Intercept)   E 
89.0503893 0.1050202 

$D 
(Intercept)   E 
107.84384655 -0.07620397 
+2

Возможно, добавьте переменную ответа как имя в каждый элемент списка? Что-то вроде 'vars <- combn (names (DF), 2)'; 'names (the-coef-list) <- vars [1,]'. Может быть. – Henrik

+0

Очень хорошее предложение @Henrik –

+0

Это потрясающе, спасибо вам большое.Я смог использовать один и тот же код combn() для построения каждой регрессии: combn (имена (DF), 2, function (x) {коэффициенты (график (DF [, x]))}, simplify = FALSE). Как бы добавить в регрессионную строку к каждому сюжету? Могу ли я где-нибудь вложить функцию lines()? Я искал формулу, но я продолжал получать ошибки. Или, возможно, запустите отдельный abline()? Еще раз спасибо! – mrp

1

Использование combn для всех комбинации имена o f (в следующем примере я предположил, что вам нужна комбинация из двух столбцов) и Map для выполнения циклов.

Пример использования данных mtcars из R:

colc<-names(mtcars) 
colcc<-combn(colc,2) 
colcc<-data.frame(colcc) 
kk<-Map(function(x)lm(as.formula(paste(colcc[1,x],"~",paste(colcc[2,x],collapse="+"))),data=mtcars), as.list(1:nrow(colcc))) 

head(kk) 
[[1]] 

Call: 
lm(formula = as.formula(paste(colcc[1, x], "~", paste(colcc[2, 
    x], collapse = "+"))), data = mtcars) 

Coefficients: 
(Intercept)   cyl 
    37.885  -2.876 


[[2]] 

Call: 
lm(formula = as.formula(paste(colcc[1, x], "~", paste(colcc[2, 
    x], collapse = "+"))), data = mtcars) 

Coefficients: 
(Intercept)   disp 
    29.59985  -0.04122 


[[3]] 

Call: 
lm(formula = as.formula(paste(colcc[1, x], "~", paste(colcc[2, 
    x], collapse = "+"))), data = mtcars) 

Coefficients: 
(Intercept)   hp 
    30.09886  -0.06823 


[[4]] 

Call: 
lm(formula = as.formula(paste(colcc[1, x], "~", paste(colcc[2, 
    x], collapse = "+"))), data = mtcars) 

Coefficients: 
(Intercept)   drat 
    -7.525  7.678 


[[5]] 

Call: 
lm(formula = as.formula(paste(colcc[1, x], "~", paste(colcc[2, 
    x], collapse = "+"))), data = mtcars) 

Coefficients: 
(Intercept)   wt 
    37.285  -5.344 


[[6]] 

Call: 
lm(formula = as.formula(paste(colcc[1, x], "~", paste(colcc[2, 
    x], collapse = "+"))), data = mtcars) 

Coefficients: 
(Intercept)   qsec 
    -5.114  1.412 
2

Я бы рекомендовал также взглянуть на корреляционной матрицы (cor(DF)), которая, как правило, лучший способ открыть для себя линейные соотношения между переменными. Корреляция тесно связана с ковариацией и наклонами простой линейной регрессии. Ниже приведено приведенное ниже вычисление этой ссылки.

Образец данных:

set.seed(1) 
DF <- data.frame(
    A=rnorm(50, 100, 3), 
    B=rnorm(50, 100, 3), 
    C=rnorm(50, 100, 3), 
    D=rnorm(50, 100, 3), 
    E=rnorm(50, 100, 3) 
) 

Наклон регрессии cov(x, y)/var(x)

beta = cov(DF) * (1/diag(var(DF))) 

      A   B   C   D   E 
A 1.00000000 -0.045548503 0.028448192 -0.32982367 0.01800795 
B -0.03354243 1.000000000 0.003298708 -0.02489518 0.04501362 
C 0.02429041 0.003824755 1.000000000 0.24269838 0.15550116 
D -0.22407592 -0.022967212 0.193107904 1.00000000 -0.08977834 
E 0.01038445 0.035248685 0.105020194 -0.07620397 1.00000000 

Отрезок является mean(y) - beta * mean(x)

colMeans(DF) - beta * colMeans(DF) 

      A   B   C   D   E 
A 1.421085e-14 104.86992 97.44795 133.38310 98.49512 
B 1.037180e+02 0.00000 100.02095 102.85026 95.83477 
C 9.712461e+01 99.16182 0.00000 75.38373 84.06356 
D 1.226899e+02 102.53263 80.87529 0.00000 109.22915 
E 9.886859e+01 96.38451 89.41391 107.51930 0.00000 
Смежные вопросы