R中的预测精度

R中的预测精度,r,R,我已按照StMoMo软件包文件中的说明,将Lee Carter与加拿大的死亡率数据相匹配 我的项目的下一步是测量Lee-Carter模型的预测精度,以适应加拿大的数据 为此,我尝试使用accurity(),但遇到了一个错误,因为我的Lee Carter拟合属于“FitsMomo”类,而不是“forecast”类或时间序列 我是否可以在“FitStMo”对象上使用其他预测精度函数,该函数将为我计算平均误差、均方根误差、平均绝对误差、平均百分比误差、平均绝对百分比误差和平均绝对比例误差 雷普雷克斯

我已按照StMoMo软件包文件中的说明,将Lee Carter与加拿大的死亡率数据相匹配

我的项目的下一步是测量Lee-Carter模型的预测精度,以适应加拿大的数据

为此,我尝试使用accurity(),但遇到了一个错误,因为我的Lee Carter拟合属于“FitsMomo”类,而不是“forecast”类或时间序列

我是否可以在“FitStMo”对象上使用其他预测精度函数,该函数将为我计算平均误差、均方根误差、平均绝对误差、平均百分比误差、平均绝对百分比误差和平均绝对比例误差

雷普雷克斯 使用STMO文档中使用的EWMaleData创建Reprex,以专门标记错误:

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)