首页 > 解决方案 > 如何在 python 中使用形状、位置和比例参数绘制 GEV 分布曲线

问题描述

对于给定的数据集,我们使用 R 计算了 GEV 参数 - 形状、位置和比例。过去有人使用相同的参数使用matlab绘制GEV曲线 - 结果是这样发布的:

在此处输入图像描述

我需要使用 matplotlib 绘制 GEV 曲线——但是计算出的形状、位置和比例参数不会产生相同的曲线——我可能会遗漏什么吗?可能我计算y不正确,因为y仅介于 0 和 1 之间,而原始数据介于 20 和 55 之间。

在 R 中计算的参数(仅供参考 - 无需查看 R 代码)

library(extRemes)
library(boot)
dataset <- read.table("table.csv")
GEVfit <- fevd(dataset$MAXTEMP,type = "GEV", method = "MLE")

用 Python 绘图

from scipy.stats import genextreme
import numpy as np
import matplotlib.pyplot as plt

shape = -0.168374
loc = 25.649717
scale = 2.37303

x = np.linspace(2, 11000, 100000)
y = genextreme.cdf(x, shape, loc, scale)

plt.xscale('log')
plt.plot(x, y)

在此处输入图像描述

标签: pythonmatplotlibstatistics

解决方案


我不相信你有合适的配合,特别是关于scaleshape参数。

R使用负数形状,而在 scipy 形状参数中c必须是非负数,详见此处

你的比例参数太小了,你必须有数千个,如果不是更多的话,毕竟你的 X 轴高达 10 4。Fe,如果我运行具有正形状和大比例尺的修改代码,我会得到如下图所示的内容

from scipy.stats import genextreme
import numpy as np
import matplotlib.pyplot as plt

shape = 0.168374
scale = 2000.0
loc = 2.37303

x = np.linspace(1, 11000, 100000)
y = 20 + (55-20)*genextreme.cdf(x, shape, loc, scale)

plt.xscale('log')
plt.plot(x, y)

在此处输入图像描述

当然,这是不对的,但看起来更接近原版。故事的寓意 - 检查您的适合度和/或您的数据


推荐阅读