Python中如何判断一个拟合是否合理

问题描述 投票:0回答:2

我正在使用

lmfit
将函数拟合到 Python 中的数据。我想告诉你合不合身。考虑这个例子(实际上是我的数据):

大多数人会同意情节的契合度是合理的。另一方面,“不适合的例子”显示了大多数人会同意这种适合不好的情况。作为一个人,我有能力进行这种“统计眼力测试”,以判断情节是否适合。

现在我想自动化这个过程,因为我有很多数据集和拟合,根本无法单独查看它们中的每一个。我正在通过以下方式使用卡方检验:

result = model.fit(y_values, params, x=x_values) # `model` was previously created using lmfit.
degrees_of_freedom = result.nfree
significance_alpha = .05
print('Is fit good?', scipy.stats.chi2.ppf(1-significance_alpha, degrees_of_freedom)>result.chisqr)

无论我选择什么

significance_alpha
,它都会拒绝所有的配合,即使配合“还不错”。例如,设置
significance_alpha=1e-10
拒绝了上图中的拟合,实际上它对我来说看起来“相当好”,我不想拒绝它。

所以我的具体问题是:我做错了什么?或者,通常会进行哪些其他类型的测试或程序来过滤“合适”和“不合适”?

python curve-fitting goodness-of-fit
2个回答
0
投票

lmfit 提供了许多统计数据来评估拟合优度。以下统计数据将打印在拟合报告中,从

result = model.fit(y_values, params, x=x_values) 
print(result.fit_report()

这些统计数据中的每一个都可以用来比较两个拟合。

Reduced chi-square
,这两个信息标准都是为了能够比较不同数量变量(或自由度)的拟合度。除了
R-squared
之外的所有这些都应该减少以更好地适应,而
R-squared
应该增加。

为了将对统计数据的解释从“两个或多个拟合中的较好者”的意思更改为“客观上良好的拟合”,通常需要确保

chi-square
中心的拟合残差被适当地缩放对数据中不确定性的良好估计,通常替换

residual = data - fit

residual = (data - fit)/epsilon

其中

epsilon
是数据中的 1-sigma 不确定性。如果是这种情况,那么“合适”的
chi-square
大约为
N_free
,因此
reduced chi-square
大约为 1.

请注意,在这些统计数据中,

R-squared
far 使用最差的,因为
data-data.mean()
明确使用意味着不匹配不是与数据中的不确定性(应该是)进行比较,而是与数据中的不确定性进行比较数据本身的变化。例如,如果您的数据中有阶跃函数或数据中有单个但突出的峰值(如您的数据那样),则大多数数据点可能远离平均值,因此分母将相当大,使
R-squared
看起来非常接近 1.


0
投票

我发现了问题,我对零条目的垃圾箱给出了零不确定性。为这些 bin 添加 1 的不确定性使卡方检验正常工作。

© www.soinside.com 2019 - 2024. All rights reserved.