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