2014-11-01 2 views
1

всехЛинейные модели в R для всех переменных в data.frame, возвращает матрицу результатов

я пытаюсь соответствовать линейные модели для нескольких переменных и сообщать обо всех R-квадрат значения.

Однако я хотел бы спросить, есть ли способ сделать это за один раз, а не делать это в паре?

, например, я знаю, как сделать это с 2-х переменных, как:

data(mtcats) 
fit<-lm(formula = mtcars[,1] ~ mtcars[,2]) 
summary(fit)$r.squared 

mtcars имеет 11 числовых переменных, есть способ донг его для всех переменных? Я имею в виду, поскольку есть 11 переменных, мы хотим записать все значения r-квадрата? Нам нужна матрица 11 на 11, которая симметрична и диагональна 0s?

ответ

2

Вы можете использовать outer

res1 <- outer(colnames(mtcars), colnames(mtcars), FUN= function(x,y) { 
      sapply(as.list(paste(x,y, sep="~")), function(z) { 
       form1 <- as.formula(z) 
       fit <- lm(form1, data=mtcars) 
       summary(fit)$r.squared}) 
       }) 

или expand.grid

indx <- expand.grid(colnames(mtcars), colnames(mtcars), stringsAsFactors=FALSE) 
res2 <- sapply(seq_len(nrow(indx)),function(i) {i1 <- indx[i,] 
         form1 <-as.formula(paste(i1[,1], i1[,2], sep="~")) 
         fit <- lm(formula=form1, data=mtcars) 
         summary(fit)$r.squared}) 

dim(res2) <- c(11,11) 
res2[1:3,1:3] 
#   [,1]  [,2]  [,3] 
#[1,] 0.0000000 0.7261800 0.7183433 
#[2,] 0.7261800 0.0000000 0.8136633 
#[3,] 0.7183433 0.8136633 0.0000000 

identical(res1,res2) 
#[1] TRUE 
2

Поскольку это одной переменной модели регрессии, т-квадрат только квадрат коэффициента корреляции между каждой парой переменные, так что вы можете сделать это:

rsq = cor(mtcars)^2 
diag(rsq) = 0 # To get zeros on the diagonals 

Вот первые 3 строки и столбцы:

> rsq[1:3, 1:3] 
      mpg  cyl  disp 
mpg 0.0000000 0.7261800 0.7183433 
cyl 0.7261800 0.0000000 0.8136633 
disp 0.7183433 0.8136633 0.0000000 

Кстати, вы можете найти corrplot пакет полезной для визуализации R-квадрат значения. Пакет действительно предназначен для корреляций, а не квадратов корреляций, но это простой способ быстро получить представление о том, какие пары переменных имеют самые сильные отношения. Вы также можете использовать более общую схему нагрева, но corrplot предоставляет несколько более целенаправленных инструментов для корреляций.

library(corrplot) 

corrplot.mixed(cor(mtcars)^2) 

# Or, to sort the column order by clustering 
corrplot.mixed(cor(mtcars)^2, order="hclust") 

См. the vignette для получения дополнительной информации.

+0

+1 для 'corrplot.mixed' – akrun

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

  • Нет связанных вопросов^_^