You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

基于R语言的双投资组合回归模型截距对比及Wald检验准备

嘿,我懂你要做的事儿——对比两个投资组合回归模型的截距,为Wald检验做准备对吧?我给你整理了一套清晰的R实现步骤,不管你是已经分开拟合了模型,还是想换更严谨的联合模型方式,都能搞定:

方法一:用联合模型(推荐,更严谨)

1. 先把数据整合成适合的格式

首先你需要把两个投资组合的数据合并到一个数据框里,添加一个分组变量(比如portfolio)来区分两个组合。假设你的原始数据是宽格式(每列对应一个组合),可以用tidyverse来转成长格式:

# 先安装/加载tidyverse(如果还没装的话)
# install.packages("tidyverse")
library(tidyverse)

# 模拟你的数据结构(替换成你自己的实际数据)
y <- cbind(portfolio1 = rnorm(100), portfolio2 = rnorm(100))
x1 <- cbind(portfolio1 = rnorm(100), portfolio2 = rnorm(100))
x2 <- cbind(portfolio1 = rnorm(100), portfolio2 = rnorm(100))
x3 <- cbind(portfolio1 = rnorm(100), portfolio2 = rnorm(100))
x4 <- cbind(portfolio1 = rnorm(100), portfolio2 = rnorm(100))

# 将每个变量转成长格式,然后合并成一个数据框
df_list <- list(
  y = as.data.frame(y) %>% pivot_longer(everything(), names_to = "portfolio", values_to = "y"),
  x1 = as.data.frame(x1) %>% pivot_longer(everything(), names_to = "portfolio", values_to = "x1"),
  x2 = as.data.frame(x2) %>% pivot_longer(everything(), names_to = "portfolio", values_to = "x2"),
  x3 = as.data.frame(x3) %>% pivot_longer(everything(), names_to = "portfolio", values_to = "x3"),
  x4 = as.data.frame(x4) %>% pivot_longer(everything(), names_to = "portfolio", values_to = "x4")
)

combined_df <- reduce(df_list, inner_join, by = "portfolio")

2. 拟合包含分组的联合模型

接下来拟合一个包含投资组合分组的线性模型。如果你只关心截距的差异,可以先拟合不带交互项的模型;如果怀疑自变量的效应在两个组合间也有差异,就加交互项:

# 不带交互项的模型(假设自变量效应在两组间一致)
base_model <- lm(y ~ portfolio + x1 + x2 + x3 + x4, data = combined_df)

# 带交互项的模型(允许自变量效应在两组间不同)
full_model <- lm(y ~ portfolio*(x1 + x2 + x3 + x4), data = combined_df)

3. 用Wald检验对比截距

car包的linearHypothesis函数来做Wald检验,原假设是两个组合的截距相等

# 安装/加载car包
# install.packages("car")
library(car)

# 检验不带交互项模型的截距差异
linearHypothesis(base_model, "portfolioportfolio2 = 0")

# 检验带交互项模型的截距差异
linearHypothesis(full_model, "portfolioportfolio2 = 0")

这里解释一下:R会把portfolio1作为参照组,portfolioportfolio2的系数就是组合2的截距减去组合1的截距。检验这个系数是否为0,就是在检验两个截距是否相等。


方法二:基于已拟合的两个独立模型

如果你已经分别拟合了两个模型,也可以手动计算Wald统计量:

# 假设你已经拟合了两个模型
model1 <- lm(y[,1] ~ x1[,1] + x2[,1] + x3[,1] + x4[,1])
model2 <- lm(y[,2] ~ x1[,2] + x2[,2] + x3[,2] + x4[,2])

# 提取两个模型的截距
intercept1 <- coef(model1)[1]
intercept2 <- coef(model2)[1]

# 提取截距的方差(从模型的方差-协方差矩阵中获取)
var_intercept1 <- vcov(model1)[1,1]
var_intercept2 <- vcov(model2)[1,1]

# 计算截距差异的标准误(因为两个模型独立,协方差为0)
se_diff <- sqrt(var_intercept1 + var_intercept2)

# 计算Wald统计量和P值
wald_stat <- (intercept1 - intercept2) / se_diff
p_value <- 2 * pnorm(abs(wald_stat), lower.tail = FALSE)

# 输出结果
cat("截距差异:", intercept1 - intercept2, "\n")
cat("Wald统计量:", wald_stat, "\n")
cat("P值:", round(p_value, 4), "\n")

小提醒

  • 推荐用联合模型的方法,因为它能更好地控制组间的潜在差异,结果更可靠;
  • 不管用哪种方法,都要先检查模型的诊断(比如残差的正态性、同方差性),确保模型设定合理;
  • 如果你的两个投资组合数据是相关的(比如同一时间点的观测),可能需要考虑用面板模型或者调整协方差结构,但如果是独立样本,上面的方法就够用了。

内容的提问来源于stack exchange,提问作者dakofla

火山引擎 最新活动