R中的循环 - 线性回归

时间:2016-12-30 02:23:32

标签: r loops regression linear-regression zoo

我刚开始学习R并且似乎无法让这个循环起作用。我有一个包含250行和503列(y)的数据框和另一个包含250行和1列(x)的数据框。

我试图获得一个循环来运行503个单独的回归,而不必单独输入,即。

(output_1 <- lm(y$1st column ~ x))
(output_2 <- lm(y$2nd column ~ x))

每个回归中的所有250行。

我试过这个循环:

for (i in 1:503) {
output_loop <- lm(y[,i]~x)
}
output_total <- cbind(output$coefficients)

但这只给了我一个截距和一个系数,而不是503截距和503系数。

每个数据框的行都有时间标记,这些时间标记以yyyy-mm-dd格式对齐,但我不认为这会影响回归,因为所寻求的截距和系数输出与时间无关。

我也尝试过使用基本的lm:

(output <- lm(y~x))
 output_total <- cbind(output$coefficients)

并且这给出了503个截距和503个系数,但是当我针对某些列检查输出时输出是错误的(如上所述运行单个回归)。

非常感谢您对此循环的任何帮助!

谢谢

3 个答案:

答案 0 :(得分:0)

我不确定你是以最好的方式接近这个,但我认为这将达到你所描述的目标。

# create some toy data to match your description

set.seed(340)
y <- data.frame(replicate(503, runif(250, 0, 1)))
x <- data.frame(v1=runif(250, 0, 1))


out <- data.frame(NULL)              # create object to keep results
for (i in 1:length(y)) {
  m <- summary(lm(y[,i] ~ x[,1]))    # run model
  out[i, 1] <- names(y)[i]           # print variable name
  out[i, 2] <- m$coefficients[1,1]   # intercept
  out[i, 3] <- m$coefficients[2,1]   # coefficient
}
names(out) <- c("y.variable", "intercept", "coef.x")
head(out)

# y.variable intercept       coef.x
# 1         X1 0.4841710 -0.015186852
# 2         X2 0.4972775 -0.002306964
# 3         X3 0.4410326  0.096450185
# 4         X4 0.4547249  0.041582039
# 5         X5 0.5039661  0.062429142
# 6         X6 0.5331573 -0.092806309

答案 1 :(得分:0)

您的循环已经关闭,您只需要创建一个位置来捕获结果。

output_loop=list(NA)
for (i in 1:503) {
output_loop[[i]] <- lm(y[,i]~x)

}

如果您只想要data.frame中的系数,那么重新组织事物以捕获每个模型中的两个系数

output_loop=data.frame(int=NA,slope=NA)
for (i in 1:503) {
  output_loop[i,] <- coefficients(lm(y[,i]~x))

}

答案 2 :(得分:0)

这是基于tidyverse和broom软件包的“整洁”解决方案:

library(tidyverse)
library(broom)


set.seed(340)
y <- data.frame(replicate(503, runif(250, 0, 1)))
x <- data.frame(v1=runif(250, 0, 1))

y %>%
    pivot_longer(everything(), names_to = "variable", values_to = "y") %>%
    split(.$variable) %>%
    map(., ~ mutate(., x = x$v1)) %>% # Note that v1 is the name of MY data frame x
    map(., ~ lm(y ~ x, data = .)) %>%
    map(tidy) %>% # This bit here extracts the model parameters. If you want any other information, you could use summary()
    imap_dfr(., ~ mutate(.x, variable = .y))

#> # A tibble: 1,006 x 6
#>    term         estimate std.error statistic  p.value variable
#>    <chr>           <dbl>     <dbl>     <dbl>    <dbl> <chr>   
#>  1 (Intercept)  0.484       0.0361  13.4     3.72e-31 X1      
#>  2 x           -0.0152      0.0631  -0.241   8.10e- 1 X1      
#>  3 (Intercept)  0.499       0.0356  14.0     2.84e-33 X10     
#>  4 x           -0.00601     0.0622  -0.0967  9.23e- 1 X10     
#>  5 (Intercept)  0.492       0.0344  14.3     3.03e-34 X100    
#>  6 x            0.000321    0.0600   0.00534 9.96e- 1 X100    
#>  7 (Intercept)  0.530       0.0361  14.7     1.65e-35 X101    
#>  8 x           -0.0972      0.0631  -1.54    1.25e- 1 X101    
#>  9 (Intercept)  0.534       0.0357  15.0     1.77e-36 X102    
#> 10 x           -0.0144      0.0623  -0.231   8.18e- 1 X102    
#> # ... with 996 more rows

reprex package(v0.3.0)于2019-12-04创建