我注意到,对数据进行的一变量线性模型的相关性不同于在两个数据帧之间计算的相关性。我手动计算了相关性,结果与线性模型相同。
在下面的图像中,使用两个数据帧计算的相关性在上方,而在循环中计算的相关性在下方。问题是,为什么相关性不同?
该代码可能需要一分钟才能运行,因为它是从GitHub采购代码的。
source("https://github.com/KaroRonty/ShillerGoyalDataRetriever/raw/master/ShillerGoyalDataRetriever.r")
# Return calculation for the next i years
returns <- as.data.frame(matrix(nrow = 1774))
for(i in 1:20){
temp <- (lead(full_data$index, 12 * i) / full_data$index) ^ (1 / i)
returns <- cbind(returns, temp)
temp <- NA
colnames(returns)[i + 1] <- paste0("ret_", i)
}
returns <- returns %>% select(-V1)
# CAPE calculation for the next i years
capes <- as.data.frame(matrix(nrow = 1774))
temp2 <- NA
for(i in 1:20){
for(j in 1:I(nrow(full_data) - 12)){
temp2[j + i * 12] <- full_data$Price[j + i * 12] / mean(full_data$Earnings[j:I(j + i * 12 - 1)])
}
temp2 <- temp2[1:1774]
capes <- cbind(capes, temp2)
temp2 <- NA
colnames(capes)[i + 1] <- paste0("cape_", i)
}
capes <- capes %>% select(-V1)
# Calculate correlations
correlations <- cor(capes, returns, use = "complete.obs")
# Calculate correlations manually
x <- as.data.frame(matrix(nrow = 20, ncol = 20))
correlations_manual <- as.data.frame(matrix(nrow = 20, ncol = 20))
for(i in 1:20){
for(j in 1:20){
correlations_manual[i, j] <- cor(capes[, i], returns[, j], use = "complete.obs")
}
}
colnames(correlations_manual) <- colnames(correlations)
rownames(correlations_manual) <- rownames(correlations)
identical(correlations, correlations_manual) # FALSE