You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 00:24:04