我希望编写一个函数,该函数接受时间序列和标准差作为参数,并返回一个调整后的时间序列,看起来像一份预测。
通过这个函数,我想测试一个稳定性系统,该系统以预测的天气时间序列列表作为输入参数。
我考虑使用以下方法实现这样一个函数:
vector<tuple<datetime, double>> get_adjusted_timeseries(vector<tuple<datetime, double>>& timeseries_original, const double stddev, const double dist_mid)
{
auto timeseries_copy(timeseries_original);
int sign = randInRange(0, 1) == 0 ? 1 : -1;
auto left_limit = normal_cdf_inverse(0.5 - dist_mid, 0, stddev);
auto right_limit = normal_cdf_inverse(0.5 + dist_mid, 0, stddev);
for (auto& pair : timeseries_copy)
{
double number;
do
{
nd_value = normal_distribution_r(0, stddev);
}
while (sign == -1 && nd_value > 0.0 || sign == 1 && nd_value < 0.0);
pair = make_tuple(get<0>(pair), get<1>(pair) + (nd_value / 100) * get<1>(pair));
if (nd_value > 0.0 && nd_value < right_limit || nd_value < 0.0 && nd_value > left_limit)
{
sign = sign == -1 ? 1 : -1;
}
}
return timeseries_copy;
}
- 复制原始时间序列,也属于
vector<tuple<datetime, double>>
类型。 - 获取随机数,可以是0或1,并使用该数字设置符号。
- 使用反向累积分布函数获取限制条件,这表明当复制的时间序列的值接近原始值时,符号将更改。此处显示了反向CDF的实现
- 对于时间序列中的每个项目进行循环:
- 获取正常分布的值,当
sign == -1
时应该低于零,当sign == 1
时应该大于零 - 根据正常分布值调整时间序列的旧值
- 如果正常分布值接近原始值,则更改
sign
。
- 获取正常分布的值,当
例如,低标准差的结果如下图所示:
如果计算两个时间序列的平均绝对百分比误差(MAPE),则会出现以下关系:
- 标准差:5 -> MAPE: ~0.04
- 标准差:10 -> MAPE: ~0.08
- 标准差:15 -> MAPE: ~0.12
- 标准差:20 -> MAPE: ~0.16
您认为这种方法如何?
这个函数可以用来测试必须处理预测时间序列的系统吗?
randInRange
在这种情况下表现良好。是这样吗?double number;
没有被使用吗?sign = sign == -1 ? 1 : -1;
可以写成sign = -sign;
。 - Ted Lyngmo