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倍的系数,但是输出是错误的,当我点检查了一些列的输出(如上述运行个人回归) 。

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

谢谢

+0

流明(Y〜x),其中x大于一列是多重回归,系数将不匹配来自503个独立回归中的每一个的系数。 – Seth

我不知道你这个接近的最好方式,但在这里,我想会实现你所描述的东西。

# 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

您的示例不可重现(请尝试使用'y user20650

+0

我得到一个循环不是必需的(他们是否曾经?),但有时循环使得它更容易理解正在发生的事情。也许不是这种情况。但我不明白为什么这个例子不可重现。如果我重新启动R并再次运行,我会得到相同的结果。我错过了什么? –

+1

重新举例说明,第一行在y定义之前使用sapply(也许你在重新启动时会在工作空间中加载) – user20650

您的循环已关闭,您只需创建一个地点以获取结果。

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

这个工程!谢谢。如果我在控制台输入 “output_loop” 它给我所有503拦截并系数如 '[[503]] 召唤: LM(式= Y [,I]〜X) 系数: (截距)x' 但是我会失去所有503列的标题。有没有办法保留列的标题,并有两行的截距和系数?我试图变化: 'output_total ejt

+0

有几个很好的策略。如果你想要的只是截取和斜率,那么只需将列表中的输出组织到数据框中即可。如果你想从回归输出中得到更多的东西,那么我设置的列表可以帮你。我添加了数据框架结构的结果,所以你有两个。 – Seth

# 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