使用PyStan实现BSTS模型生成虚拟数据触发TypeError问题求助
报错原因分析
- 直接触发报错的问题:
range()仅支持传入整数参数,你代码中for t in range(xt_array)、for t in range(qt_array)、for i in range(qi_array)三处均传入了numpy数组,不符合参数要求。 - 未初始化变量直接使用:代码中
x、q、tau、c、a等变量均未提前定义初始化,就直接按下标赋值,后续运行也会报错。 - 逻辑判断错误:
if (NUM_SAMPLES_t < 65)判断的是固定全局参数,不会随循环的t值变化,不符合时间序列逐时点判断的需求。 - 语法错误:
q[i] = (Q[i] - Q[i-1])(1 - np.exp(-t - 65 / tau[i]))两处括号间缺少乘号*,Python会识别为函数调用抛出错误。 - 随机数维度不匹配:
np.random.normal(250, 1, 150)每次生成150个数值,无法直接赋值给单个变量。 - 函数无返回值:
generate_data_dummy_bsts函数末尾没有return语句,调用后无法拿到生成的观测值用于绘图。
修复方案
以下是调整后的可运行代码,匹配你给出的下标取值规则(t∈[1,104],i∈[0,7]):
import numpy as np import matplotlib.pyplot as plt SEED = 1234 np.random.seed(SEED) NUM_SAMPLES_t = 104 # 匹配t取值范围1-104 NUM_SAMPLES_i = 8 # 匹配i取值范围0-7共8个值 def generate_data_dummy_bsts(): A = 10 B = 10 KD = 10 a = 2 # 可根据实际公式要求调整参数值 # 初始化所有变量 x = np.zeros(NUM_SAMPLES_t) q = np.zeros(NUM_SAMPLES_i) tau = np.zeros(NUM_SAMPLES_i) c = np.random.uniform(1, 10, NUM_SAMPLES_i) # 可根据实际公式要求调整c的取值范围 y = np.zeros(NUM_SAMPLES_t) # 初始化x的前两个值,避免t<2时下标越界 x[0] = np.random.normal(250, 1) x[1] = 2 * x[0] + np.random.normal(250, 1) for t in range(2, NUM_SAMPLES_t): # 趋势项计算 x[t] = 2 * x[t-1] - x[t-2] + np.random.normal(0, 1) # 效应项计算 if t < 65: q[:] = 0 else: for i in range(NUM_SAMPLES_i): tau[i] = A * np.log(c[i]) + B + np.random.normal(0, 1) Q_i = a * c[i] / KD + c[i] Q_i_prev = a * c[i-1] / KD + c[i-1] if i>0 else 0 q[i] = (Q_i - Q_i_prev) * (1 - np.exp(-(t - 65) / tau[i])) qt = np.sum(q) # 最终观测值生成 y[t] = x[t] + qt + np.random.normal(0, 1) return y # 绘图代码 fig,ax = plt.subplots(figsize=(10,3)) ax.plot(generate_data_dummy_bsts()) plt.show()
注:随机数均值已做调整避免生成的数值过大导致曲线无实际意义,可根据你的公式要求自行修改参数。
内容的提问来源于stack exchange,提问作者Eka
相关产品推荐
相关产品推荐

