【发布时间】:2020-10-20 22:17:03
【问题描述】:
我正在尝试计算列对之间的相关性,然后在所有列上拟合 n 个线性模型以预测所述相关性,然后预测相关性(然后使用它们生成相关的随机 a、b、c、d、 e 但这并不重要)。
我已经做了。但是现在代码真的是重复的,我想知道如何以动态的方式来避免代码中的重复。我正在使用data.table,因为性能是关键,因为表可能很大。
这就是我目前所拥有的:
data <-
data.table(a = rnorm(20),
b = rnorm(20),
c = rnorm(20),
d = rnorm(20),
logret_a = rnorm(20),
logret_b = rnorm(20),
logret_c = rnorm(20),
logret_d = rnorm(20))
corr <- function(y) cor(y[, 1], y[, 2])
corperiod <- 3
#1 here i would like one line instead of one line per ab, ac, ad, bc, bd
data$cor_ab <- c(NA, zoo::rollapplyr(data[-1, .(logret_a, logret_b)], corperiod, corr, by.column = FALSE, fill = NA))
data$cor_ac <- c(NA, zoo::rollapplyr(data[-1, .(logret_a, logret_c)], corperiod, corr, by.column = FALSE, fill = NA))
data$cor_ad <- c(NA, zoo::rollapplyr(data[-1, .(logret_a, logret_d)], corperiod, corr, by.column = FALSE, fill = NA))
# and so on...
#2 here i would like two lines instead of two lines per ab, ac, ad, bc, bd
fit_cor_ab <- lm(data=data, cor_ab ~ a + b + c + d + logret_a + logret_b + logret_c + logret_d)
fit_cor_ab <- MASS::stepAIC(fit_cor_ab, direction="both", trace = FALSE)
fit_cor_ac <- lm(data=data, cor_ac ~ a + b + c + d + logret_a + logret_b + logret_c + logret_d)
fit_cor_ac <- MASS::stepAIC(fit_cor_ac, direction="both", trace = FALSE)
# and so on...
simul <- as.data.table(matrix(0, nrow=100, ncol=ncol(data)))
colnames(simul) <- colnames(data)
simul[1] <- data[1]
# skipping for loop
i <- 2
#3 here i would like one line instead of one line per ab, ac, ad, bc, bd
simul[i, cor_ab := predict(fit_cor_ab, newdata = simul[i-1])]
simul[i, cor_ac := predict(fit_cor_ac, newdata = simul[i-1])]
# and so on...
我想要的是有一种方法可以对data.tabledata 中的任意数量的列执行 #1、#2 和 #3 中标记的这 3 个操作,并且无论data 中列的名称。我的代码有效...只是我必须在任何时候更改data 的内容时对其进行修改,所以这不太好...
任何帮助表示赞赏!
【问题讨论】:
标签: r data.table