R中的循环 - 线性回归
问题描述:
我刚刚开始学习R,似乎无法使此循环正常工作。我有一个包含250行和503列(y)的数据框,另一个数据框包含250行和1列(x)。R中的循环 - 线性回归
我想获得一个循环运行503个单独的回归,而不必单独输入即ie。
(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倍的系数,但是输出是错误的,当我点检查了一些列的输出(如上述运行个人回归) 。
对这个循环的任何帮助非常感谢!
谢谢
答
我不知道你这个接近的最好方式,但在这里,我想会实现你所描述的东西。
# 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
答
您的循环已关闭,您只需创建一个地点以获取结果。
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))
}
答
# libraries
library('purrr')
library('data.table')
# data
set.seed(340)
df1 <- data.frame(x=runif(250, 0, 1),
replicate(503, runif(250, 0, 1)))
setDT(df1)
df1 <- melt.data.table(df1, id = 'x', variable.factor = FALSE, value.name = 'y')
# apply lm() on data df1
model_lm_rsqr <- df1 %>%
split(.$variable) %>%
map(~ lm(y ~ x, data = .)) %>%
map(summary) %>%
map_dbl("r.squared")
model_lm_coeff <- df1 %>%
split(.$variable) %>%
map(~ lm(y ~ x, data = .)) %>%
map(summary) %>%
map("coefficients")
# outputs
model_lm_rsqr['X1']
# X1
# 7.381324e-05
model_lm_coeff[['X1']]
# Estimate Std. Error t value Pr(>|t|)
# (Intercept) 0.500224626 0.03534444 14.1528503 9.867274e-34
# x -0.008564851 0.06330103 -0.1353035 8.924817e-01
rbindlist(l = lapply(map(.x = model_lm_coeff, .f = ~ {t(.x[,1])}), as.data.frame), idcol = TRUE)
# .id (Intercept) x
# 1: X1 0.5002246 -0.008564851
# 2: X10 0.4759053 0.035537332
# 3: X100 0.5200009 -0.078890569
# 4: X101 0.4804617 0.096970266
# 5: X102 0.5593092 -0.077299502
# ---
# 499: X95 0.5413627 -0.017625063
# 500: X96 0.5016745 -0.093123400
# 501: X97 0.5449859 -0.060117246
# 502: X98 0.4670116 0.110287578
# 503: X99 0.5121481 -0.042537902
流明(Y〜x),其中x大于一列是多重回归,系数将不匹配来自503个独立回归中的每一个的系数。 – Seth