如何在数据框中的一列和所有其他列之间执行线性回归,并在新数据框中保存r平方值?

时间:2019-11-26 22:08:56

标签: r loops linear-regression repeat

我正在尝试测试数据帧中一列(CS.1)中的数据与数据帧中的其余列(allree)有多相似。数据框有283列,第一列包含用于观察的标签。我尝试设置一个for循环以执行线性回归并将r平方值以及列名保存在新数据框中。但是,我一直在数据帧附近接收错误,结果是长度不正确。

这是代码:

#this is the data frame
allree<-read.csv("All REE 2.csv")

#creating the data frame for the results
cs1 <- data.frame(row = 1:280)
dat <- data.frame(rsq = 1:3, samp = 1:3)

#trying to test each column against the second column (CS.1) and save the r-squared values
for(x in 3:283){
  na.rm=TRUE
  reg<-lm(CS.1~allree[,x], data=allree)
  rsq<-summary(reg)$r.squared
  dat$r2[x] <- rsq
  dat$sample[x] <- colnames(allree)[x]
  if(x==3) cs1<-dat
  if(x>3)cs1<-rbind(cs1, dat)
  }

这是错误:

Error in `$<-.data.frame`(`*tmp*`, "r2", value = c(NA, NA, 0.180399384405891, : replacement has 4 rows, data has 3

是否需要将原始数据分成多个数据帧?如果我能以这种方式找出答案,我想在其他几列中重复此测试。

1 个答案:

答案 0 :(得分:0)

由于您没有提供可复制的示例,因此我将使用mtcars数据框来完成此操作。

我将使用purrrbroomdplyr包形式的函数,而不是使用for循环。

数据

此数据框默认为R

glimse(mtcars)
Observations: 32
Variables: 11
$ mpg  <dbl> 21.0, 21.0, 22.8, 21.4, …
$ cyl  <dbl> 6, 6, 4, 6, 8, 6, 8, 4, …
$ disp <dbl> 160.0, 160.0, 108.0, 258…
$ hp   <dbl> 110, 110, 93, 110, 175, …
$ drat <dbl> 3.90, 3.90, 3.85, 3.08, …
$ wt   <dbl> 2.620, 2.875, 2.320, 3.2…
$ qsec <dbl> 16.46, 17.02, 18.61, 19.…
$ vs   <dbl> 0, 0, 1, 1, 0, 1, 0, 1, …
$ am   <dbl> 1, 1, 1, 0, 0, 0, 0, 0, …
$ gear <dbl> 4, 4, 4, 3, 3, 3, 3, 4, …
$ carb <dbl> 4, 4, 1, 1, 2, 1, 4, 2, …

代码

# Map function from purrr allow you to do a loop
purrr::map(

  # set the elements to iterate over.
  # in this case all variables except 
  # the first (mpg)
  mtcars[,-1],

  # The second argument is the body of the loop. 
  # An lm call with the formula as follow.
  # here the .x is replace by a new variable 
  # in each iteration
  ~lm(mpg ~ .x, data = mtcars)
  ) %>%

  # Then summarise each output with broom::glance
  purrr::map(broom::glance) %>%

  # bind all summary
  dplyr::bind_rows(.id = "variable") %>%

  # selecting the variables of interest
  dplyr::select(variable, r.squared)

# A tibble: 10 x 2
   variable r.squared
   <chr>        <dbl>
 1 cyl          0.726
 2 disp         0.718
 3 hp           0.602
 4 drat         0.464
 5 wt           0.753
 6 qsec         0.175
 7 vs           0.441
 8 am           0.360
 9 gear         0.231
10 carb         0.304