基于Python:最小二乘直线与平面拟合的R²比较
解答:3D平面拟合的R²计算与2D R²的可比性
一、如何从3D拟合残差计算R²
R²的核心逻辑是模型能解释的响应变量变异占总变异的比例,公式可以简化为:
R² = 1 - (残差的变异 / 响应变量z的总变异)
结合你已有的3D拟合代码,已经得到了残差errors,只需要稍作转换就能计算出R²:
对应你的补充代码实现
import numpy as np # 将矩阵格式的errors转为一维数组 E = np.squeeze(np.asarray(errors)) Z = np.array(zs) # 计算3D拟合的R² r2_3d = 1 - (E.var() / Z.var())
等价的平方和计算方式
你也可以用平方和来计算(和方差法结果一致,因为方差是平方和除以样本量,比例会相互抵消):
ss_res = np.sum(E ** 2) # 残差平方和 ss_total = np.sum((Z - Z.mean()) ** 2) # z的总平方和 r2_3d = 1 - (ss_res / ss_total)
两种方法本质相同,选你习惯的方式即可。
二、3D的R²能否和2D的R²比较?
完全可以直接比较,原因很明确:
- 两者的响应变量都是
zs,R²的计算基准完全一致——都是衡量模型对z的变异的解释程度。 - 2D拟合是用
x单独解释z,3D拟合是用x+y共同解释z,对比两者的R²,就能直观看到加入y后对模型解释力的提升。
对比的实际意义:
- 如果3D的R²比2D的提升微乎其微,说明
y分量对解释z的变异几乎没有帮助,这时候完全可以忽略y。 - 如果3D的R²比2D的提升明显,说明
y对z的影响不可忽视,不能轻易忽略。
⚠️ 小提醒:R²本身会随着加入的变量增多而非递减(哪怕变量没实际作用),如果想要更严谨地判断y是否有显著贡献,你可以考虑计算调整R²(会对变量数量做惩罚),或者对3D模型中y的系数做显著性检验(比如t检验)。
补充:2D拟合的R²获取
你的2D代码用了stats.linregress,返回的r_value是x和z的皮尔逊相关系数,它的平方就是2D拟合的R²:
from scipy import stats slope, intercept, r_value, p_value, std_err = stats.linregress(xs, zs) r2_2d = r_value ** 2
内容的提问来源于stack exchange,提问作者Jason
相关产品推荐
相关产品推荐

