r语言 混频数据回归 midas_r

我在进行混频数据回归时使用了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安生共同编写:
  • 该回答引用于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),以评估模型在不同区中的表现。

  • 您可以尝试使用R中的lm()函数和dplyr包来实现分区制回归。以下是一个可能的解决方案:

首先,您需要将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]])
# 等等...
  • 希望这能帮助您实现分区制回归。望采纳哦~
  • 这个错误提示的意思是你构建的data frame中有不同长度的数据结构,导致无法合并。

根据报错信息来看,是因为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)

需要注意合并时相同列名的数据框也要进行调整,确保列数一致。

  • 我误解了你的问题。在midas_r函数中使用subset参数似乎无法正确限制回归的数据集。相反,您可以手动创建3个子集并对每个子集分别运行midas_r回归。

以下是示例代码:

# 创建一个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数据太多,会导致样本量很少,可能会影响回归结果。
如果我的回答解决了您的问题,请采纳!

在进行分区制回归时,可以使用R语言中的for循环来实现。具体步骤如下:
1. 将数据按照时间段分组,生成一个分组变量d1,其中第一个区制为1,第二个区制为2,第三个区制为3,其余为NA。
2. 使用for循环,对每个区制进行回归分析。在循环中,使用subset命令筛选出当前区制的数据,并进行midas_r回归分析。
3. 将每个区制的回归结果保存下来,计算出每个区制的RMSE值,以便比较不同区制下模型的拟合优度。
具体代码如下:

# 生成分组变量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