R中的预测精度
我已按照StMoMo软件包文件中的说明,将Lee Carter与加拿大的死亡率数据相匹配 我的项目的下一步是测量Lee-Carter模型的预测精度,以适应加拿大的数据 为此,我尝试使用accurity(),但遇到了一个错误,因为我的Lee Carter拟合属于“FitsMomo”类,而不是“forecast”类或时间序列 我是否可以在“FitStMo”对象上使用其他预测精度函数,该函数将为我计算平均误差、均方根误差、平均绝对误差、平均百分比误差、平均绝对百分比误差和平均绝对比例误差 雷普雷克斯 使用STMO文档中使用的EWMaleData创建Reprex,以专门标记错误:R中的预测精度,r,R,我已按照StMoMo软件包文件中的说明,将Lee Carter与加拿大的死亡率数据相匹配 我的项目的下一步是测量Lee-Carter模型的预测精度,以适应加拿大的数据 为此,我尝试使用accurity(),但遇到了一个错误,因为我的Lee Carter拟合属于“FitsMomo”类,而不是“forecast”类或时间序列 我是否可以在“FitStMo”对象上使用其他预测精度函数,该函数将为我计算平均误差、均方根误差、平均绝对误差、平均百分比误差、平均绝对百分比误差和平均绝对比例误差 雷普雷克斯
library("StMoMo")
library("demography")
library("forecast")
constLC <- function(ax, bx, kt, b0x, gc, wxt, ages){
c1 <- mean(kt[1, ], na.rm = TRUE)
c2 <- sum(bx[, 1], na.rm = TRUE)
list(ax = ax + c1 * bx, bx = bx / c2, kt = c2 * (kt - c1))
}
LC <- StMoMo(link = "logit", staticAgeFun = TRUE, periodAgeFun = "NP",
constFun = constLC)
LC <- lc(link = "logit")
LC$gnmFormula
#> [1] "D/E ~ -1 + offset(o) + factor(x) + Mult(factor(x), factor(t), inst = 1)"
EWMaleData
#> Mortality data for England and Wales
#> Series: male
#> Years: 1961 - 2011
#> Ages: 0 - 100
#> Exposure: central
EWMaleIniData <- central2initial(EWMaleData)
ages.fit <- 55:89
wxt <- genWeightMat(ages = ages.fit, years = EWMaleIniData$years,
clip = 3)
LCfit <- fit(LC, data = EWMaleIniData, ages.fit = ages.fit, wxt = wxt)
#> StMoMo: The following cohorts have been zero weigthed:
#> 1872 1873 1874 1954 1955 1956
#> StMoMo: Start fitting with gnm
#> Initialising
#> Running start-up iterations..
#> Running main iterations.....
#> Done
#> StMoMo: Finish fitting with gnm
LCfor <- forecast(LCfit, h = 50)
class(LCfit)
#> [1] "fitStMoMo"
class(LCfor)
#> [1] "forStMoMo"
accuracy(LCfit)
#> Error in accuracy.default(LCfit): First argument should be a forecast object
#> or a time series.
accuracy(LCfor)
#> Error in accuracy.default(LCfor): First argument should be a forecast object
#> or a time series.
library(“StMoMo”)
图书馆(“人口学”)
图书馆(“预测”)
施工年龄:0-100
#>曝光:中环
EWMALEINI数据初始化
#>正在运行启动迭代。。
#>正在运行主迭代。。。。。
#>完成
#>StMoMo:使用gnm完成装配
立法会三题:"fitstmo
班级(LCfor)
#>[1]“forStMoMo”
精度(LCfit)
#>准确性错误。默认值(LCfit):第一个参数应该是预测对象
#>或者一个时间序列。
精度(LCfor)
#>准确性错误。默认值(LCfor):第一个参数应该是预测对象
#>或者一个时间序列。
我不完全确定预测中的准确度()如何工作,但在某种程度上,它必须比较真实值和预测值,并返回它们之间差异的度量。从广义上讲,这可以被视为交叉验证的一种形式。由于accurity()
不适用于StMoMo
对象,我们不妨自己开发一个交叉验证例程。
对于这种形式的交叉验证的简短入门,我建议使用forecast
中的tsCV()
。如果我们可以在这里使用tsCV()
,那就好了,但它只适用于单变量时间序列,死亡率数据基本上是多变量时间序列。
我还应该提到,在今天之前,我从未听说过死亡率建模,所以我对模型理论的部分非常模糊
第一位与已经发布的内容相同
library(StMoMo)
library(demography)
library(forecast)
data(EWMaleData)
constLC <- function(ax, bx, kt, b0x, gc, wxt, ages){
c1 <- mean(kt[1, ], na.rm = TRUE)
c2 <- sum(bx[, 1], na.rm = TRUE)
list(ax = ax + c1 * bx, bx = bx / c2, kt = c2 * (kt - c1))
}
LC <- StMoMo(link="logit", staticAgeFun=TRUE, periodAgeFun="NP", constFun=constLC)
LC <- lc(link="logit")
EWMaleIniData <- central2initial(EWMaleData)
从Hyndman的笔记中可以看出,要做到这一点,我们必须使用时间序列中几个点的预测以及分数的平均值进行比较。这个问题太宽泛了,很可能无法解决。不要在一个问题中问那么多问题。为了问一个更好的问题,请阅读并回答。@RuiBarradas好的,我将编辑它,只问一个问题。除非您提供一些可复制的代码,否则这个答案被回答的可能性很低。假设加拿大数据对您的问题不重要,我建议您将示例代码基于StMoMo
软件包提供的数据集。@AkselA我现在正在研究可复制的示例@RuiBarradas我现在添加了一个reprex,非常棒,非常感谢!非常有用。你让我走出了两天的低谷!再次感谢!
ages.fit <- 55:89
years.fit <- EWMaleIniData$years[1]:(EWMaleIniData$years[1] + 30)
years.for <- 10
wxt <- genWeightMat(ages=ages.fit, years=years.fit, clip=3)
LCfit <- fit(LC, data=EWMaleIniData, ages.fit=ages.fit,
years.fit=years.fit, wxt=wxt)
LCfor <- forecast(LCfit, h=years.for)
cvy <- LCfor$years # years used in forecast
cva <- LCfor$ages # ages used in forecast
pred <- LCfor$rates # predicted mortality rates
# actual mortality rates subset to the same ages and years as forecast
actual <- EWMaleIniData$Dxt/EWMaleIniData$Ext
actual <- actual[rownames(actual) %in% cva,
colnames(actual) %in% cvy]
# A collection of error measures. plenty of others can be devised
err <- pred - actual
Q <- pred/actual
rmse <- sqrt(rowMeans(err^2))
mae <- rowMeans(abs(err))
smape <- 100 * (rowMeans(exp(abs(log(Q)))) - 1)
par(mfrow=c(3, 1), mar=c(3, 3, 1, 1), mgp=c(2, 0.8, 0), oma=c(0, 0, 2, 0))
plot(as.numeric(names(rmse)), rmse, type="h", xlab="")
plot(as.numeric(names(mae)), mae, type="h", xlab="")
plot(as.numeric(names(smape)), smape, type="h", xlab="Ages")
mtext(paste("Forecast accuracy for the years",
paste(cvy[c(1, years.for)], collapse=" - ")),
3, outer=TRUE)