<think>根据用户要求,我们将代码分为两个主要部分:可视化部分和检验部分。每个部分都包含多个函数,但各自独立。
注意:用户要求将可视化和检验代码分别放在一起,再分别给出不同方法代码。因此,我们将:
1. 先给出所有可视化相关的函数(放在一个代码块中)
2. 再给出所有检验指标计算相关的函数(放在一个代码块中)
3. 最后给出一个使用示例,展示如何调用这些函数
同时,每个函数都设计为独立可调用的,这样用户可以根据需要单独使用某个函数。</think>以下是将非线性回归拟合度检验的可视化和统计检验功能分别整合的完整代码实现:
### 一、可视化分析函数集(完整代码)
```python
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
def plot_fit_comparison(x, y_true, y_pred, model_name):
"""
绘制原始数据与拟合曲线对比图
:param x: 自变量
:param y_true: 实际观测值
:param y_pred: 模型预测值
:param model_name: 模型名称
"""
plt.figure(figsize=(10, 6))
plt.scatter(x, y_true, label='观测数据', alpha=0.6, color='blue')
plt.plot(x, y_pred, 'r-', label='模型拟合', linewidth=2)
plt.xlabel('自变量')
plt.ylabel('因变量')
plt.title(f'{model_name}模型拟合效果')
plt.legend()
plt.grid(True, linestyle='--', alpha=0.7)
plt.show()
def plot_residual_analysis(y_pred, residuals):
"""
残差分析可视化(包含残差图和Q-Q图)
:param y_pred: 模型预测值
:param residuals: 模型残差
"""
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 6))
# 残差图
ax1.scatter(y_pred, residuals,
residuals, alpha=0.6,
edgecolor='k', s=80)
ax1.axhline(y=0, color='r', linestyle='--', linewidth=2)
ax1.set_xlabel('预测值', fontsize=12)
ax1.set_ylabel('残差', fontsize=12)
ax1.set_title('残差 vs 预测值', fontsize=14)
ax1.grid(True, linestyle='--', alpha=0.5)
# Q-Q图
stats.probplot(residuals, dist="norm", plot=ax2)
ax2.set_title('残差Q-Q图', fontsize=14)
ax2.grid(True, linestyle='--', alpha=0.5)
plt.tight_layout()
plt.show()
def plot_confidence_band(x, y, y_pred, residuals, confidence=0.95):
"""
绘制置信区间和预测区间
:param x: 自变量
:param y: 实际观测值
:param y_pred: 模型预测值
:param residuals: 模型残差
:param confidence: 置信水平(0-1)
"""
# 计算标准误差
se = np.sqrt(np.sum(residuals**2) / (len(y) - 2))
# 计算置信区间
from scipy.stats import t
t_val = t.ppf((1 + confidence)/2, df=len(y)-2)
conf_band = t_val * se * np.sqrt(1/len(y) + (x - np.mean(x))**2 / np.sum((x - np.mean(x))**2))
# 计算预测区间
pred_band = t_val * se * np.sqrt(1 + 1/len(y) + (x - np.mean(x))**2 / np.sum((x - np.mean(x))**2))
# 绘图
plt.figure(figsize=(10, 6))
plt.scatter(x, y, alpha=0.6, label='观测数据')
plt.plot(x, y_pred, 'r-', label='拟合曲线')
plt.fill_between(x, y_pred - conf_band, y_pred + conf_band,
color='orange', alpha=0.3, label='95%置信区间')
plt.fill_between(x, y_pred - pred_band, y_pred + pred_band,
color='green', alpha=0.2, label='95%预测区间')
plt.xlabel('自变量')
plt.ylabel('因变量')
plt.title('拟合曲线与置信区间')
plt.legend()
plt.grid(True, linestyle='--', alpha=0.5)
plt.show()
```
### 二、统计检验函数集(完整代码)
```python
import numpy as np
from scipy import stats
from scipy.optimize import curve_fit
def fit_nonlinear_model(model_func, x_data, y_data, p0=None):
"""
非线性模型拟合函数
:param model_func: 自定义非线性模型函数
:param x_data: 自变量数据
:param y_data: 因变量数据
:param p0: 初始参数猜测值
:return: 拟合参数、预测值、残差
"""
params, cov = curve_fit(model_func, x_data, y_data, p0=p0, maxfev=5000)
y_pred = model_func(x_data, *params)
residuals = y_data - y_pred
return params, np.sqrt(np.diag(cov)), y_pred, residuals
def calculate_r2(y_true, y_pred, k_params):
"""
计算决定系数和调整决定系数
:param y_true: 实际观测值
:param y_pred: 模型预测值
:param k_params: 模型参数数量
:return: R², 调整R², MSE
"""
ss_res = np.sum((y_true - y_pred)**2)
ss_tot = np.sum((y_true - np.mean(y_true))**2)
r2 = 1 - (ss_res / ss_tot)
n = len(y_true)
adj_r2 = 1 - (1 - r2) * (n - 1) / (n - k_params - 1)
mse = ss_res / n
return r2, adj_r2, mse
def calculate_information_criteria(y_true, y_pred, k_params):
"""
计算AIC和BIC信息准则
:param y_true: 实际观测值
:param y_pred: 模型预测值
:param k_params: 模型参数数量
:return: AIC, BIC
"""
n = len(y_true)
residuals = y_true - y_pred
mse = np.mean(residuals**2)
# AIC计算(修正版本)
aic = n * np.log(mse) + 2 * k_params + (2*k_params*(k_params+1))/(n-k_params-1)
# BIC计算
bic = n * np.log(mse) + k_params * np.log(n)
return aic, bic
def residual_normality_test(residuals):
"""
残差正态性检验
:param residuals: 模型残差
:return: Shapiro-Wilk检验统计量和p值
"""
shapiro_stat, shapiro_p = stats.shapiro(residuals)
return shapiro_stat, shapiro_p
def durbin_watson_test(residuals):
"""
杜宾-瓦特森检验(残差自相关检验)
:param residuals: 模型残差
:return: DW统计量
"""
diff = np.diff(residuals)
dw = np.sum(diff**2) / np.sum(residuals**2)
return dw
```
### 三、完整使用示例
```python
# ========== 模型定义 ==========
# 示例:S型生长曲线模型 y = a / (1 + exp(-b*(x-c)))
def sigmoid_growth(x, a, b, c):
return a / (1 + np.exp(-b * (x - c)))
# ========== 数据生成 ==========
np.random.seed(42)
x = np.linspace(0, 10, 100)
y_true = sigmoid_growth(x, 10, 1, 5)
y_data = y_true + 0.5 * np.random.normal(size=x.size)
# ========== 模型拟合 ==========
params, param_stds, y_pred, residuals = fit_nonlinear_model(
sigmoid_growth, x, y_data, p0=[8, 0.5, 4]
)
print(f"拟合参数: {params}")
print(f"参数标准差: {param_stds}")
# ========== 统计检验 ==========
# 计算拟合优度
r2, adj_r2, mse = calculate_r2(y_data, y_pred, k_params=3)
print(f"\n拟合优度:")
print(f"R² = {r2:.4f} | 调整R² = {adj_r2:.4f} | MSE = {mse:.4f}")
# 计算信息准则
aic, bic = calculate_information_criteria(y_data, y_pred, k_params=3)
print(f"\n信息准则:")
print(f"AIC = {aic:.2f} | BIC = {bic:.2f}")
# 残差检验
shapiro_stat, shapiro_p = residual_normality_test(residuals)
dw = durbin_watson_test(residuals)
print(f"\n残差检验:")
print(f"Shapiro-Wilk正态性检验: W = {shapiro_stat:.4f}, p = {shapiro_p:.4f}")
print(f"Durbin-Watson自相关检验: DW = {dw:.4f}")
# ========== 可视化分析 ==========
# 拟合效果对比
plot_fit_comparison(x, y_data, y_pred, "S型生长曲线")
# 残差分析
plot_residual_analysis(y_pred, residuals)
# 置信区间
plot_confidence_band(x, y_data, y_pred, residuals)
```
### 功能说明:
1. **可视化分析函数集**:
- `plot_fit_comparison`: 直观展示原始数据与拟合曲线
- `plot_residual_analysis`: 残差图与Q-Q图联合诊断
- `plot_confidence_band`: 置信区间与预测区间可视化
2. **统计检验函数集**:
- `fit_nonlinear_model`: 核心拟合函数(带最大迭代次数控制)
- `calculate_r2`: 拟合优度计算(含MSE)
- `calculate_information_criteria`: 修正版AIC/BIC计算
- `residual_normality_test`: 残差正态性检验
- `durbin_watson_test`: 残差自相关检验
3. **使用特点**:
- 可视化与统计检验完全分离,可按需调用
- 所有函数独立完整,无需额外依赖
- 包含置信区间计算等高级功能
- 修正的信息准则计算更准确