我正在尝试使用delta method计算非线性回归模型的置信区间。我的标准误是5、3、3的数组,但是我认为标准误应该是5个值,而不是矩阵。尝试从预测值中添加或减去standard_error数组时出现值错误。任何帮助,将不胜感激。

df = pd.DataFrame({
        'cumsum_days': [1,2,3,4,5],
        'pred': [388.259631, 368.389649, 349.754534, 332.264306, 315.836485]})

cov = np.array([[2.67918945e+04, 2.62421460e+02, 9.08452505e+00],
       [2.62421460e+02, 4.31869566e+00, 1.24995272e-01],
       [9.08452505e+00, 1.24995272e-01, 3.90413410e-03]])

# estimate confidence interval for predicted probabilities
gradient = np.gradient(df['pred'], df['cumsum_days'])
std_errors = np.array([np.sqrt(np.dot(np.dot(g, cov), g)) for g in gradient])
c = 1.96 # multiplier for confidence interval

upper = np.maximum(0, np.minimum(1, (df['pred'] + std_errors * c)))
lower = np.maximum(0, np.minimum(1, (df['pred'] - std_errors * c)))


ValueError在这里:

print(df['pred'] + std_errors)
ValueError: operands could not be broadcast together with shapes (5,) (5,3,3)

最佳答案

这是一个形状问题,您的渐变的形状为(5,),而cov的形状为(3,3),通过对渐变中的每个元素g进行迭代,np.dot(g,cov)将乘以cov矩阵加一个数字g(1),得到一个形状(3,3)并创建5个形状为(3,3)的元素的列表,因此形状为(5,3,3)。

我不了解有关delta方法的详细信息,但是在我看来,应该通过删除第一个和最后一个值,然后删除一个值,然后使用形状为(5,5)的cov矩阵或形状为(3,)的渐变,您将可以执行std_error = np.sqrt(np.dot(np.dot(gradient, cov), gradient))

关于python - 矩阵代数-ValueError-计算置信区间,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59937325/

10-12 18:48