我在进行混频数据回归时使用了R语言的midas_r命令,命令如下:
test <- midas_r(yy ~ mls(yy, 1, 1) + mls(xx, 3:11, 3), start = NULL)
summary(test)
该回归不会有任何问题,但是我想要进行分区制(根据时间段不同一共分了三个区制)回归,即根据yy所在时间段进行分组回归,并探寻不同区制下模型的拟合优度(RMSE)。目前找不到合适的解决办法。
我设置了一个变量d1,也是时间序列格式的,其中如果是第一个区制则设为1,不在该区制则设为NA。
目前有尝试过在后续加subset命令
test <- midas_r(yy ~ mls(yy, 1, 1) + mls(xx, 3:11, 3), start = NULL, subset = (d1 == 1))
summary(test)
但是subset不管怎么设置都不会影响回归结果。
我也尝试了将d1与yy进行交乘,想要粗暴地完成分组回归
test <- midas_r(yy*d1 ~ mls(yy, 1, 1) + mls(xx, 3:11, 3), start = NULL)
summary(test)
但是该命令并不支持含有NA的回归。
想请问如何通过midas_r命令实现分区制回归。
参考GPT:要实现分区制回归,您可以尝试使用 lapply 函数在不同的区间内分别进行回归,然后计算不同区间的 RMSE。下面是一种可能的实现方式:
library(midasr)
# 假设 d1 中有三个区间,分别为 1, 2, 3
# 对于每个区间,提取相应的 yy 和 xx 数据
# 进行 midas_r 回归,并计算 RMSE
res_list <- lapply(unique(d1), function(i) {
idx <- d1 == i
yy_i <- yy[idx]
xx_i <- xx[idx]
model <- midas_r(yy_i ~ mls(yy_i, 1, 1) + mls(xx_i, 3:11, 3), start = NULL)
# 计算 RMSE
fitted <- predict(model)
rmse <- sqrt(mean((yy_i - fitted)^2))
# 返回结果
list(model = model, rmse = rmse)
})
# 打印每个区间的回归结果和 RMSE
for (i in seq_along(res_list)) {
cat("区间 ", i, ":\n")
summary(res_list[[i]]$model)
cat("RMSE: ", res_list[[i]]$rmse, "\n\n")
}
上述代码中,lapply 函数将 unique(d1) 中的每个元素 i 作为参数传入匿名函数,并对应提取 d1 == i 的数据进行回归和计算 RMSE。
该回答引用于gpt与OKX安生共同编写:
您可以考虑使用R语言的lm函数结合自变量中加入区组变量来实现分区制回归。以下是一个示例代码:
# 创建一个示例数据框
data <- data.frame(yy = rnorm(100), xx = rnorm(100), d1 = rep(1:3, each = 33))
# 将d1转换成factor类型的变量
data$d1 <- as.factor(data$d1)
# 对每个区进行回归
results <- lapply(levels(data$d1), function(level) {
lm(yy ~ mls(yy, 1, 1) + mls(xx, 3:11, 3), data = subset(data, d1 == level)))
})
# 查看每个区的回归结果
names(results) <- levels(data$d1)
results
其中,lapply函数会将data$d1中的每个水平作为输入,并使用subset函数进行筛选。然后,lm函数将yy作为因变量,mls(yy, 1, 1)和mls(xx, 3:11, 3)作为自变量进行回归分析。最后,将每个回归结果保存在一个列表中,并打印出来。这样,您就可以观察每个区的回归结果并比较拟合优度(例如RMSE),以评估模型在不同区中的表现。
首先,您需要将d1变量转换为因子变量,并将其添加到数据框中:
df <- data.frame(yy, xx, d1)
df$d1 <- factor(df$d1)
然后,您可以使用dplyr包中的group_by()函数按照d1进行分组,然后在每个分组中运行lm()函数来拟合模型。如下所示:
library(dplyr)
models <- df %>%
group_by(d1) %>%
do(model = lm(yy ~ mls(yy, 1, 1) + mls(xx, 3:11, 3), start = NULL, data = .))
这将为每个分区制生成一个模型,并将其存储在名为“models”的列表中。要访问模型,请使用以下代码:
models$model[[1]] # 获取第一个模型
models$model[[2]] # 获取第二个模型
# 等等...
您可以使用summary()函数检查每个模型的拟合优度(RMSE):
summary(models$model[[1]])
summary(models$model[[2]])
# 等等...
根据报错信息来看,是因为yy和xx的行数不一致导致合并时出错。你需要检查一下yy和xx的行数是否相等,如果不相等,需要对数据进行调整,使得yy和xx的长度相等才可以进行合并。
你可以使用nrow()函数来检查两个数据框的行数是否相等。例如:
nrow(yy)
nrow(xx)
如果行数不相等,可以使用subset()函数在数据框中选择需要的行数据,或使用merge()函数等方法进行数据调整。然后再使用data.frame()函数将三个数据框合并起来,确保行数和列数一致。以下是示例代码:
# 调整数据
if (nrow(yy) != nrow(xx)) {
# 如果行数不相等,使用subset函数从两个数据框中选择相同数量的行数据
yy <- subset(yy, 1:nrow(xx))
}
# 合并数据
df <- data.frame(yy, xx, d1)
需要注意合并时相同列名的数据框也要进行调整,确保列数一致。
以下是示例代码:
# 创建一个d1向量,其中包含三个时间段,每个时间段的前三行被标记为1,其余为NA
d1 <- c(rep(1,3),rep(NA,length(yy)-3))
# 计算每个观测值所属的时间段
time_period <- cut(1:length(yy), breaks = 3, labels = FALSE)
# 创建3个子集
subset1 <- which(time_period == 1)
subset2 <- which(time_period == 2)
subset3 <- which(time_period == 3)
# 在每个子集上运行midas_r回归
library(midasr)
test1 <- midas_r(yy[subset1] ~ mls(yy[subset1], 1, 1) + mls(xx[subset1], 3:11, 3), start = NULL)
test2 <- midas_r(yy[subset2] ~ mls(yy[subset2], 1, 1) + mls(xx[subset2], 3:11, 3), start = NULL)
test3 <- midas_r(yy[subset3] ~ mls(yy[subset3], 1, 1) + mls(xx[subset3], 3:11, 3), start = NULL)
# 汇总各个子集的回归结果
list(test1, test2, test3)
在上述代码中,我们首先计算每个观测值所属的时间段,并将其存储在名为time_period的变量中。然后,我们创建了3个子集,每个子集包含一个时间段中的所有观测值。最后,我们在每个子集上运行midas_r回归,并将回归结果存储在名为test1、test2和test3的变量中。
如果您想要比较不同区间的模型拟合情况,可以提取出RMSE等指标,并进行比较。
以下答案由GPT-3.5大模型与博主波罗歌共同编写:
要基于yy所在时间段进行分组回归并探索不同区间下模型的符合度,可以使用midas_r命令中的by参数。下面是一个示例代码,假设时间段分别为[1,100],[101,200],[201,300]。
test <- midas_r(yy ~ mls(yy, 1, 1) + mls(xx, 3:11, 3), by = c(rep(1,100),rep(2,100),rep(3,100)), start = NULL)
这样就会对yy根据by参数分组,然后执行midas_r回归分析。
另外,如果需要排除d1为NA的数据进行回归,可以使用na.action参数:
test <- midas_r(yy ~ mls(yy, 1, 1) + mls(xx, 3:11, 3), by = c(rep(1,100),rep(2,100),rep(3,100)), start = NULL, na.action = na.omit)
这个参数会将NA的数据删除,但是要注意,如果NA数据太多,会导致样本量很少,可能会影响回归结果。
如果我的回答解决了您的问题,请采纳!
# 生成分组变量d1
d1 <- ifelse(year(yy) < 2005, 1, ifelse(year(yy) < 2010, 2, ifelse(year(yy) < 2015, 3, NA)))
# 初始化RMSE向量
rmse <- rep(NA, 3)
# for循环进行分区制回归
for (i in 1:3) {
# 筛选出当前区制的数据
data_subset <- subset(data, d1 == i)
# 进行midas_r回归分析
model <- midas_r(yy ~ mls(yy, 1, 1) + mls(xx, 3:11, 3), data = data_subset)
# 保存回归结果
assign(paste0("model_", i), model)
# 计算RMSE值
rmse[i] <- sqrt(mean((model$fitted.values - data_subset$yy)^2))
}
# 输出每个区制的RMSE值
rmse