我刚开始学习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个系数,但是当我针对某些列检查输出时输出是错误的(如上所述运行单个回归)。
非常感谢您对此循环的任何帮助!
谢谢
答案 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创建