R 使用seq_-On和lapply处理多个数据帧(CAPM)

R 使用seq_-On和lapply处理多个数据帧(CAPM),r,lapply,seq,R,Lapply,Seq,我有48个数据帧,我希望计算每个数据帧中每个股票的线性回归(CAPM)。每个数据帧包含相同数量的股票,约470只,标准普尔500指数,有36个月的数据。最初我有一个大数据帧,但我成功地将数据拆分为48个数据帧(这可能不是最明智的举动,但这是我解决问题的方式) 当我运行以下代码时,它工作正常。注意,我在第1区硬编码 beta_results <- lapply(symbols, function(x) { temp <- as.data.frame(Block1) inp

我有48个数据帧,我希望计算每个数据帧中每个股票的线性回归(CAPM)。每个数据帧包含相同数量的股票,约470只,标准普尔500指数,有36个月的数据。最初我有一个大数据帧,但我成功地将数据拆分为48个数据帧(这可能不是最明智的举动,但这是我解决问题的方式)

当我运行以下代码时,它工作正常。注意,我在第1区硬编码

  beta_results <- lapply(symbols, function(x) {
  temp <-  as.data.frame(Block1)
  input <- as.formula(paste("temp$",x, "~ temp$SP500" ))
  capm <- lm(input)
  coefficients(capm)
 })

考虑一个嵌套的
lappy
,其中外部循环遍历数据帧列表,内部循环遍历每个符号。结果是一个48人的列表,每个列表包含470组beta系数

另外,作为旁白,最好使用许多结构相似的对象的列表,尤其是运行相同的操作,避免淹没您的全局环境(管理1个列表vs 48个数据帧):

#包含“块”的所有全局变量的数据帧列表

dfList@Parfait对于使用lappy处理数据帧列表的OPs问题的回答是正确的

以下示例显示了如何使用
数据。可以使用表
获取每个股票的
lm(股票~SP500)
系数(使用Block1示例数据):

库(data.table)

dt您是否考虑过使用原始的single data.frame,然后使用date和stock name作为ID列和一个值列。然后,您可以使用data.table或dplyr以及by/group来执行线性回归。谢谢。我还没有考虑过这种方法,我会考虑一下。非常感谢你的支持。感谢您对48个数据帧列表的评论。在另一个令人畏缩的举动中,我实际拥有一个包含48个子列表的列表,然后将其拆分为48个数据帧,然后由于缺乏处理列表的技能而变得相似。如果你有兴趣的话,我可以把整件事都告诉你……我还要说,我认为我是在付出代价,用堆栈溢出上更伟大的思想来解决我的问题,而不是真正了解发生了什么。这个解决方案不管用吗?你会犯什么错误?同样,使用类似结构化对象的列表来避免管理太多其他对象。我确实在重新格式化时遇到了一些问题,但还是设法解决了这个问题。方法非常理想,再次感谢您的帮助!如果解决方案有效,请接受它以确认解决方案。另外,想知道您对
重新格式化
做了哪些更改?谢谢您。我认为这种方法在今后的工作中将非常有用
beta_results <- lapply(seq_along(symbols), function(i,x) {
 temp <-  as.data.frame(paste0("Block",i))
 input <- as.formula(paste("temp$",x, "~ temp$SP500" ))
 capm <- lm(input)
coefficients(capm)
})
 symbols <- c("A", "AAPL", "BRKB")
             A      AAPL  BRKB    SP500
2016-04-29 -0.139  0.111  0.122    0.150 
2016-05-31  0.071  0.095  0.330    0.200 
2016-06-30 -0.042 -0.009  0.230    0.150
2016-07-29  0.090  0.060  0.200    0.100
2016-08-31  0.023  0.013  0.005    0.050  
2016-09-30  0.065  0.088  0.002    0.100
# LIST OF DATA FRAMES FROM ALL GLOBAL VARIABLES CONTAINING "Block"
dfList <- mget(ls(pattern="Block"))

# NESTED LAPPLY
results_list <- lapply(dfList, function(df) {

  beta_results <- lapply(symbols, function(x) {
     input <- reformulate(quote(SP500), response=x)     
     capm <- lm(input, data=df)
     coefficients(capm)
  })

})
library(data.table)
dt <- structure(list(date = c("2016-04-29", "2016-05-31", "2016-06-30", 
"2016-07-29", "2016-08-31", "2016-09-30"), A = c(-0.139, 0.071, 
-0.042, 0.09, 0.023, 0.065), AAPL = c(0.111, 0.095, -0.009, 0.06, 
0.013, 0.088), BRKB = c(0.122, 0.33, 0.23, 0.2, 0.005, 0.002), 
    SP500 = c(0.15, 0.2, 0.15, 0.1, 0.05, 0.1)), .Names = c("date", 
"A", "AAPL", "BRKB", "SP500"), row.names = c(NA, -6L), class = "data.frame")

setDT(dt)
# Convert to long format for easier lm
dt_melt <- melt(dt, id.vars = c("date", "SP500"))
# Extract coefficients by doing lm for each unique variable (i.e. stock)
dt_lm <- dt_melt[, as.list(coefficients(lm(value~SP500))), by = variable]
# Fix column names
setnames(dt_lm, c("stock", "intercept", "slope"))

> dt_lm
   stock   intercept      slope
1:     A  0.05496970 -0.3490909
2:  AAPL  0.01421212  0.3636364
3:  BRKB -0.10751515  2.0454545