如何检验非线性回归估计参数的显著性 含t检验、F检验及p值计算
非线性回归参数显著性与整体F检验实现方案
你使用的scipy.optimize.curve_fit是非线性最小二乘拟合,参数显著性检验和整体F检验可基于拟合返回的协方差矩阵、残差结果计算,具体实现如下:
1 单参数t检验(检验p、q的个体显著性)
检验假设:
H0:对应参数统计上不显著;H1:对应参数统计上显著
计算逻辑:
- 从
curve_fit返回的协方差矩阵cov中提取对角线元素开平方得到参数的标准误 - t统计量 = 参数估计值 / 对应标准误
- 自由度 = 样本量 - 参数个数(此处参数为p、q共2个)
- 双侧t检验的p值对应t分布的尾部概率
2 整体F检验(检验模型整体显著性)
检验假设:
H0:p和q同时为0;H1:p或q任意一个不为0
计算逻辑:
- 计算解释平方和ESS(预测值与真实值均值的差的平方和)、残差平方和RSS(真实值与预测值的差的平方和)
- F统计量 = (ESS/参数个数) / (RSS/自由度)
- F检验p值对应F分布的尾部概率
完整实现代码
import pandas as pd import numpy as np import scipy.optimize from scipy.stats import t, f import sklearn.metrics # 原有数据读取与拟合逻辑 x = pd.read_excel('fitting_data.xlsx', sheet_name="bevshyb cars (2)", index_col=None, dtype={'Name': str, 'Value': float}) def fit(t,p,q): return 22500000*(((p*p*p+2*p*p*q+p*q*q)*np.exp(-p*t-q*t))/(((p+q*np.exp(-p*t-q*t))*(p+q*np.exp(-p*t-q*t))))) g = [0.000001,0.000001] t = x['t'].values carsfact = x['BEVSHYB'].values c, cov = scipy.optimize.curve_fit(fit,t,carsfact,g) p_est, q_est = c print('估计参数p:', round(p_est,10)) print('估计参数q:', round(q_est,10)) # 拟合优度计算 y_pred = fit(t, *c) print('R^2: ',sklearn.metrics.r2_score(carsfact, y_pred)) print('explained_variance_score: ', sklearn.metrics.explained_variance_score(carsfact, y_pred)) # ========== 新增:显著性检验部分 ========== n = len(carsfact) # 样本量 k = 2 # 参数个数 df = n - k # 自由度 # 1 单参数t检验 se = np.sqrt(np.diag(cov)) # 计算参数标准误 t_stats = c / se # 计算t统计量 p_values = [2 * (1 - t.cdf(np.abs(ts), df=df)) for ts in t_stats] # 计算双侧p值 print('\n===== 单参数显著性检验结果 =====') print(f'参数p:t统计量={round(t_stats[0],4)}, p值={round(p_values[0],6)}') print(f'参数q:t统计量={round(t_stats[1],4)}, p值={round(p_values[1],6)}') # 2 整体F检验 y_mean = np.mean(carsfact) ESS = np.sum((y_pred - y_mean)**2) # 解释平方和 RSS = np.sum((carsfact - y_pred)**2) # 残差平方和 F_stat = (ESS / k) / (RSS / df) F_pvalue = 1 - f.cdf(F_stat, dfn=k, dfd=df) print('\n===== 整体F检验结果 =====') print(f'F统计量={round(F_stat,4)}, p值={round(F_pvalue,6)}')
结果解读
- 单参数检验:如果对应p值小于你设定的显著性水平(通常为0.05),则拒绝原假设,认为该参数统计显著
- 整体F检验:如果p值小于显著性水平,则拒绝原假设,认为回归模型整体是显著的
注:上述检验基于非线性最小二乘的渐近正态性假设,大样本下结果更可靠。
内容的提问来源于stack exchange,提问作者Alexander Plesovskikh
相关产品推荐
相关产品推荐

