R的glm函数中cbind()的作用是什么?如何用Python复现?
R代码中cbind()的作用
在R的glm()函数指定二项分布族时,支持两种响应变量输入格式:
- 逐行是单次试验的0/1标签,代表单次试验成功/失败
- 逐行是
cbind(成功次数, 失败次数)的两列矩阵,代表该行对应的汇总试验结果,适合分组后的汇总数据
你这里用到的cbind(normalized_power, 1 - normalized_power),是把归一化后的功率值作为“比例对应的计数基准”传递给二项回归模型,本质是拟合针对比例值的加权逻辑回归,权重对应每组的试验总量。
Python statsmodels 正确复现逻辑
你原来的Python代码问题在于只把单变量np作为响应变量输入,没有和R一样同时传入两个端点值,statsmodels的二项GLM完全支持类似R的双列响应变量输入,修正后的代码如下:
import pandas as pd import math import statsmodels.api as sm from statsmodels.genmod.families import Binomial # 特征构造逻辑和你原有逻辑一致,注意如果要完全对齐R代码,需要按运动员分组取对应运动员的最大功率做归一化,不要直接用全局max self.pmax = max(self.power_array) normalized_power = [x / self.pmax for x in self.power_array] log_time = [math.log(x) for x in self.time_array] temp_diff = [abs(x - 60) for x in self.temp_array] # 构造输入数据表 df = pd.DataFrame({ "np": normalized_power, "1-np": [1 - x for x in normalized_power], "log_time": log_time, "temp_diff": temp_diff }) # 拟合GLM,endog传入两列的成功/失败数组,默认加截距项和R逻辑一致 endog = df[["np", "1-np"]] exog = sm.add_constant(df[["log_time", "temp_diff"]]) model = sm.GLM(endog, exog, family=Binomial()).fit() # 如果你偏好公式写法,也可以用如下语法实现同样效果 # model = sm.glm("I(np, `1-np`) ~ log_time + temp_diff", df, family=Binomial()).fit()
拟合完成后调用model.summary()即可查看和Rsummary(fit)一致的回归结果。
内容的提问来源于stack exchange,提问作者dvr
相关产品推荐
相关产品推荐

