R 中的循环 - 线性回归

问题描述 投票:0回答:3

我刚刚开始学习 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)

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

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

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

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

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

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

谢谢你

r loops regression linear-regression zoo
3个回答
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

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))

}

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 包于 2019-12-04 创建(v0.3.0)

© www.soinside.com 2019 - 2024. All rights reserved.