Как распечатать (скорректировать) R-квадрат модели регрессии? - PullRequest
0 голосов
/ 28 мая 2018

Я начинающий с R. У меня есть набор данных о загрязнении воздуха.Столбцы представляют собой сайт, измеренную концентрацию и 80 переменных (v1-v80), которые могут влиять на концентрацию.Я хочу сделать модель с прямой пошаговой регрессией на основе R-squared / adj с моим собственным кодом (поэтому я не хочу использовать что-то вроде step () или regsubset ()).Зависимой переменной является концентрация, а переменные v1-v80 как независимые переменные.Я написал следующий код для первого шага (набор данных упрощен):

  site concentration         v1         v2         v3
1    1   -0.84085548  1.7114409 -0.2857736 -1.0803926
2    2    1.38435934 -0.6029080  0.1381082 -0.1575344
3    3   -1.25549186 -0.4721664  1.2276303 -1.0717600

for (j in names(df)){
  model <- lm(concentration ~ df[[j]], data = df)
  print(j)
  print(summary(model))
}

Это хорошо работает, но меня интересует только R-квадрат и скорректированный R-квадрат.Я пытался печатать только (скорректированный) R-квадрат с:

for (j in names(df)){
  model <- lm(concentration ~ df[[j]], data = df)
  print(j)
  print(summary(model$r.squared))
  print(summary(model$adj.r.squared))
}

Но затем я получаю в качестве вывода (это только часть):

[1] "v1"
Length  Class   Mode 
     0   NULL   NULL 
Length  Class   Mode
     0   NULL   NULL
[1] "v2"
Length  Class   Mode 
     0   NULL   NULL 
Length  Class   Mode
     0   NULL   NULL  

Etcetera.

Как я могу получить в качестве вывода только имя соответствующей переменной и (скорректированный) R-квадрат для каждой модели, которая производится в цикле for?

Спасибо!

1 Ответ

0 голосов
/ 28 мая 2018
library(broom)
glance(model)[c(1,2)]

Input = ("site concentration         v1         v2         v3
          1    1   -0.84085548  1.7114409 -0.2857736 -1.0803926
          2    2    1.38435934 -0.6029080  0.1381082 -0.1575344
          3    3   -1.25549186 -0.4721664  1.2276303 -1.0717600")

df = read.table(textConnection(Input),header=TRUE)

for (j in names(df)){
    model <- lm(concentration ~ df[[j]], data = df)
    print(j)
    print(glance(model)[c(1,2)])
}

[1] "site"
    r.squared adj.r.squared
 1 0.02132635    -0.9573473
[1] "concentration"
    r.squared adj.r.squared
  1         1             1
[1] "v1"
  r.squared adj.r.squared
1 0.1717716    -0.6564568
[1] "v2"
  r.squared adj.r.squared
1 0.1482473    -0.7035055
[1] "v3"
  r.squared adj.r.squared
1 0.9762587     0.9525174
Warning message:
  In stats::summary.lm(x) :
  essentially perfect fit: summary may be unreliable

Использование базы R

summary(model)$adj.r.squared
summary(model)$r.squared
...