我正在尝试用ms-var模型来寻找两个状态,分别是异常状态和恢复状态,但是我将我的数据发送到R上时,却出现了问题。我的数据一共两部分,第一部分是year,从2011-2022年,第二部分为incom,代表收入增长率,以下是我的数据 2011 0.869237 2012 0.454332 2013 0.145417 2014 0.142422 2015 0.24537 2016 0.213596 2017 0.265301 2018 0.191888 2019 0.195735 2020 -0.45621 2021 0.357773 2022 -0.16064
然后我用我的代码进行了计算:
# 导入必要的库
library(readxl)
library(MSwM)
# 读取Excel文件数据
file_path <- "C:/Users/86189/Desktop/实验.xlsx" # 请注意,Windows路径的斜杠要使用正斜杠(/)或者转义的反斜杠(\\)
data <- read_excel(file_path)
# 检查数据格式(假设数据的列名为 "year" 和 "incom")
head(data)
# 计算滞后增长率
data$lag_incom <- c(NA, data$incom[-length(data$incom)]) # 创建滞后1期数据
data <- na.omit(data) # 移除缺失数据
# 将数据转换为时间序列对象
incom_ts <- ts(data$incom, start = min(data$year), frequency = 4) # 假设季度数据
# 构建VAR模型:使用tsDyn包中的VAR模型,作为MSwM的输入
library(tsDyn)
# 使用VAR模型(假设滞后阶数为1)
var_model <- lineVar(incom_ts, p = 1) # VAR(1)模型
# 使用MSwM包对VAR模型进行状态切换建模
mswm_model <- msmFit(var_model, k = 2) # k = 2表示我们有两个状态(正常状态和异常状态)
# 打印模型结果
summary(mswm_model)
# 获取状态切换的结果
states <- msmStates(mswm_model)
# 异常状态的年份
abnormal_years <- data$year[states == 2]
# 如果没有异常状态,跳过计算
if (length(abnormal_years) > 0) {
# 异常状态中的最大值和最小值
abnormal_values <- data$incom[states == 2]
max_abnormal <- max(abnormal_values)
min_abnormal <- min(abnormal_values)
# 振幅 A
A <- max_abnormal - min_abnormal # 振幅A
# t1和t2是异常状态的开始和结束年份(时间段)
t1 <- min(abnormal_years) # 异常状态的开始年份
t2 <- max(abnormal_years) # 异常状态的结束年份
# 经济韧性计算公式:Res = 2 / (A * (t2 - t1))
resilience <- 2 / (A * abs(t2 - t1))
# 输出结果
list(t1 = t1, t2 = t2, max_abnormal = max_abnormal, min_abnormal = min_abnormal, A = A, resilience = resilience)
} else {
cat("没有识别到异常状态\n")
}
却出现了> # 使用MSwM进行状态切换建模
> msm_model <- msmFit(ar_model, k = 2) # k = 2表示两个状态(正常和异常)
错误: 函数‘msmFit’标签‘object = "Arima", k = "numeric", sw = "missing", p = "missing", data = "missing", family = "missing"’找不到继承方法
>
> # 查看模型摘要
> summary(msm_model)
错误于h(simpleError(msg, call)):
在为函数“summary”选择方法时计算参数“object”时出错:找不到对象'msm_model'
>
> # 获取状态切换信息
> states <- msmStates(msm_model)
错误于msmStates(msm_model): 没有"msmStates"这个函数
>
> # 打印异常状态的年份
> abnormal_years <- time(gnp)[states == 2]
> print(abnormal_years)
numeric(0) 请问怎么办呢?
相似问题