在不使用循环的情况下获取所有列表元素的回归系数

时间:2017-08-26 13:41:06

标签: r regression

鉴于两个列表具有相同的键,您是否可以在不使用循环的情况下将回归系数放入第三个列表中,并且希望也不会为每个列表项创建临时数据框

我熟悉lapply,但不知道如何应用此案例,如果可能的话!

s = list()
s$x = list(a=c(1, 2, 3), b=c(4, 5, 6))
s$y = list(a=c(1, 2, 4), b=c(4, 5, 8))

for(i in names(s$x)) {
  df = data.frame(x = s$x[[i]], y = s$y[[i]])
  model = lm(y ~ x, df)
  s$co[[i]] = model$coefficients
}

4 个答案:

答案 0 :(得分:4)

单线解决方案

async

答案 1 :(得分:4)

将指示的匿名函数映射到x和y上,提取系数并将其连接到输入s。没有包使用。

s_out <- c(s, co = list(Map(function(x, y) coef(lm(y ~ x)), s$x, s$y)))

,并提供:

> str(s_out)
List of 3
 $ x :List of 2
  ..$ a: num [1:3] 1 2 3
  ..$ b: num [1:3] 4 5 6
 $ y :List of 2
  ..$ a: num [1:3] 1 2 4
  ..$ b: num [1:3] 4 5 8
 $ co:List of 2
  ..$ a: Named num [1:2] -0.667 1.5
  .. ..- attr(*, "names")= chr [1:2] "(Intercept)" "x"
  ..$ b: Named num [1:2] -4.33 2
  .. ..- attr(*, "names")= chr [1:2] "(Intercept)" "x"

答案 2 :(得分:2)

也许这会很有用

library(reshape2)
library(data.table)
setDT(melt(s))[, coef(lm(value[L1=="y"]~value[L1=="x"])) , L2]

或使用tidyverse

library(tidyverse)
s %>%
   transpose %>%
   map(~coef(lm(.[["y"]] ~ .[["x"]]))) %>%
   c(s, co = .)

答案 3 :(得分:1)

或者,使用lapply()base r

s = list()
s$x = list(a=c(1, 2, 3), b=c(4, 5, 6))
s$y = list(a=c(1, 2, 4), b=c(4, 5, 8))

coeff.list <- lapply(names(s$x), (function(i){
  df = data.frame(x = s$x[[i]], y = s$y[[i]])
  model = lm(y ~ x, df)
  model$coefficients
}))
names(coeff.list) <- names(s$x)

coeff.list