R画图时怎么让P值显示真实值而不是最小限制值2.2e-16?

本文介绍了在使用R语言进行统计测试时如何精确地显示极小的p值,避免默认显示为小于2.2e-16的问题,并通过具体代码示例展示了如何获取并展示真实的p值。

发文章的时候reviewer,编辑提出,R的最小值不是2.2e-16这个R能显示的最小值

手动标志该值显示。在变量后面加上$p.value

> b=matrix(c(8269,10385,5091,10385),nrow=2)
> fisher.test(b)

	Fisher's Exact Test for Count Data

data:  b
p-value < 2.2e-16
alternative hypothesis: true odds ratio is not equal to 1
95 percent confidence interval:
 1.553506 1.698125
sample estimates:
odds ratio 
   1.62418 

> fisher.test(b)$p.value
[1] 1.603129e-103

 

import numpy as np import matplotlib.pyplot as plt from numpy.polynomial.polynomial import Polynomial from sklearn.metrics import mean_absolute_percentage_error import pandas as pd # 定义斯坦麦茨方程 def steinmetz_equation(f, Bmax, k, alpha, beta): return k * (f ** alpha) * (Bmax ** beta) # 定义修正的斯坦麦茨方程 def corrected_steinmetz_equation(f, Bmax, T, k0, k1, alpha, beta): return (k0 + k1 * T) * (f ** alpha) * (Bmax ** beta) # 加载和准备数据 def load_and_prepare_data(file_path, sheet_name): data = pd.read_excel(file_path, sheet_name=sheet_name) data['Bmax'] = data.iloc[:, 4:1029].max(axis=1) data = data[data.iloc[:, 3] == '正弦波'] # 选择正弦波 return data # 绘制预测与实际数据对比的图形 def plot_smoothed_comparisons(data, material_id): f = np.linspace(data['频率'].min(), data['频率'].max(), 400) Bmax_mean = data['Bmax'].mean() T_mean = data['温度'].mean() baseline_shift = np.mean(data['损耗功率']) - steinmetz_equation(f, Bmax_mean, 0.0001, 1.8, 2.2).mean() original_preds = steinmetz_equation(f, Bmax_mean, 0.0001, 1.8, 2.2) + baseline_shift corrected_preds = corrected_steinmetz_equation(f, Bmax_mean, T_mean, 0.000095, 0.000002, 1.8, 2.2) + baseline_shift actual_fit = Polynomial.fit(data['频率'], data['损耗功率'], deg=5)(f) mape_original = mean_absolute_percentage_error(actual_fit, original_preds) mape_corrected = mean_absolute_percentage_error(actual_fit, corrected_preds) print(f"Material {material_id} - Original MAPE: {mape_original:.2f}%, Corrected MAPE:{mape_corrected:.2f}%") plt.figure(figsize=(12, 6)) plt.plot(f, actual_fit, 'k-', label='实际拟合曲线') plt.plot(f, original_preds, 'r-', label='原始预测') plt.plot(f, corrected_preds, 'g--', label='修正预测') plt.title(f'材料 {material_id} - 预测比较') plt.xlabel('频率 (Hz)') plt.ylabel('损耗功率 (W/m³)') plt.title(f'材料{material_id}: 斯坦麦茨方程预测效果平滑对比\nMAPE - 原始: {mape_original:.2f}%, 修正: {mape_corrected:.2f}%') plt.legend() plt.grid(True) plt.show() # 主程序 file_path = "C:\附件\附件\C题附件.
最新发布
03-30
<think>嗯,用户想要在Python里实现斯坦麦茨方程和它的修正版本,做数据分析和可视化,还有误差评估。首先,我得确认斯坦麦茨方程的标准形式和修正后的版本是什么样的。根据用户提供的引用,标准方程是$P_{core_{SE}} = k \cdot f^\alpha \cdot B^\beta$,而修正版可能加入了温度因素,比如$P = k \cdot f^\alpha \cdot B^\beta \cdot T^\gamma$或者线性项。需要先明确方程的结构,然后考虑怎么用Python来拟合参数。 接下来,用户可能需要数据处理的步骤。数据应该包括频率f、磁通密度B、温度T以及实际的损耗。可能需要用pandas读取和处理数据,比如处理缺失或者异常。然后,参数估计方面,引用里提到最小二乘法和智能算法比如遗传算法。对于传统方法,可以用scipy的curve_fit,而智能算法可能需要用到像scikit-opt这样的库。 然后是如何实现两个版本的方程。定义对应的函数,传统的不带温度,修正的带温度。拟合参数后,要计算预测,并评估误差,比如MSE、MAE、R&sup2;。这些指标可以用sklearn中的metrics来计算。 可视化部分,可能需要绘制实际vs预测的散点图,残差图,以及温度对损耗的影响曲线。使用matplotlib和seaborn来画图,比如子图布局,调整颜色和标签,让图表更清晰。 用户可能遇到的问题包括数据格式是否正确,参数拟合是否收敛,或者如何选择合适的算法。比如,如果数据量小,最小二乘法可能足够,但数据复杂智能算法更好。另外,温度项的引入方式可能有多种,需要根据实际情况选择指数还是线性,或者参考引用里的方法。 还要注意代码的注释和结构,让用户容易修改和调整参数。比如,提供示例数据格式,或者如何处理不同的修正方程。可能还需要解释每个步骤的目的,比如为什么用MSE作为目标函数,如何用智能算法优化参数。 最后,确保引用正确,用户提供的引用[^1]、[^2]、[^3]涉及到损耗计算、温度修正和参数优化方法,这些在回答中需要适当引用,比如在解释修正方程或优化方法提到。 总结步骤大致是:导入库、数据准备、定义模型、参数估计、预测与误差评估、可视化。每个部分用代码块展示,并解释关键点。然后生成相关问题,引导用户深入思考,比如不同算法的比较,温度项的处理,工业应用等。</think>以下分步骤说明斯坦麦茨方程及其修正版的Python实现方法,包含参数辨识、可视化分析和误差评估: ### 一、数据准备阶段 ```python import pandas as pd import numpy as np from scipy.optimize import curve_fit import matplotlib.pyplot as plt # 示例数据结构(需替换为实际数据) data = pd.DataFrame({ '频率(Hz)': [50, 100, 200, 300], '磁通密度(T)': [1.2, 1.5, 1.8, 2.0], '温度(℃)': [25, 50, 75, 100], # 修正版需要此列 '实测损耗(W/kg)': [0.8, 2.1, 4.5, 7.2] }) ``` ### 二、方程定义 ```python # 传统斯坦麦茨方程 def steinmetz(f, B, k, alpha, beta): return k * (f ** alpha) * (B ** beta) # 温度修正方程(引用[2][3]的指数形式) def modified_steinmetz(f, B, T, k, alpha, beta, gamma): return k * (f ** alpha) * (B ** beta) * (T ** gamma) ``` ### 三、参数估计 ```python # 传统方程参数拟合 X_se = data[['频率(Hz)', '磁通密度(T)']].values.T popt_se, pcov_se = curve_fit(steinmetz, X_se, data['实测损耗(W/kg)'], p0=[0.01, 1.5, 2]) # 修正方程参数拟合(引用[2]的最小二乘法) X_new = data[['频率(Hz)', '磁通密度(T)', '温度(℃)']].values.T popt_new, pcov_new = curve_fit(modified_steinmetz, X_new, data['实测损耗(W/kg)'], p0=[0.01, 1.5, 2, 0.1]) ``` ### 四、误差评估 ```python from sklearn.metrics import mean_squared_error, r2_score pred_se = steinmetz(X_se[0], X_se[1], *popt_se) pred_new = modified_steinmetz(X_new[0], X_new[1], X_new[2], *popt_new) print(f"传统方程MSE: {mean_squared_error(data['实测损耗(W/kg)'], pred_se):.4f}") print(f"修正方程MSE: {mean_squared_error(data['实测损耗(W/kg)'], pred_new):.4f}") print(f"修正方程R&sup2;: {r2_score(data['实测损耗(W/kg)'], pred_new):.4f}") ``` ### 五、可视化实现 ```python plt.figure(figsize=(12, 6)) # 实测 vs 预测对比 plt.subplot(1,2,1) plt.scatter(data['实测损耗(W/kg)'], pred_se, label='传统方程') plt.scatter(data['实测损耗(W/kg)'], pred_new, label='温度修正') plt.plot([0,8], [0,8], 'k--') plt.xlabel('实测'), plt.ylabel('预测') plt.legend() # 温度影响曲线(引用[3]的温度修正分析) plt.subplot(1,2,2) temps = np.linspace(20, 120, 100) plt.plot(temps, popt_new[-1] * temps, 'r-') plt.xlabel('温度(℃)'), plt.ylabel('温度修正系数') plt.tight_layout() plt.show() ``` ### 关键实现要点: 1. 数据预处理需确保量纲统一,建议对高频/高磁通密度数据进行标准化处理 2. 参数初始设置影响拟合速度,建议根据材料特性设置合理初始 3. 温度修正项可根据需要改为线性形式:$k \cdot f^\alpha \cdot B^\beta \cdot (1 + \gamma T)$ 4. 如需更高精度,可采用引用[2]提到的智能优化算法替换curve_fit
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值