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

如何在Python statsmodels中实现类似R的二项式回归?

在Python中实现R风格的二项式回归(成功数+失败数形式)

你遇到的PatsyError是因为statsmodels公式语法不支持(succ, fail)这种写法——Patsy会把这两个变量解析成一个长度为2的序列,和你的6行数据行数不匹配,导致报错。以下是两种可行的实现方式:

方法1:使用公式接口(适配statsmodels语法)

statsmodels的Binomial家族支持两种响应变量形式:单个0/1观测,或者成功次数占总试验次数的比例,此时需要通过weights参数传入总试验次数(成功数+失败数)。代码如下:

import pandas as pd
import statsmodels.api as sm
import statsmodels.formula.api as smf
binom = sm.families.Binomial()

tbTest = pd.DataFrame({
  'x'    : [1, 2, 3, 4, 5, 6],
  'succ' : [5, 4, 3, 2, 1, 0],
  'fail' : [1, 0, 1, 2, 2, 3],
})

# 计算总试验次数
tbTest['total'] = tbTest['succ'] + tbTest['fail']
# 用比例作为响应变量,指定weights
lrTest = smf.glm('succ / total ~ x', tbTest, family=binom, weights=tbTest['total']).fit()
print(lrTest.summary())

也可以用更简洁的写法,直接传入成功次数作为响应变量,statsmodels会结合weights自动计算比例:

lrTest = smf.glm('succ ~ x', tbTest, family=binom, weights=tbTest['total']).fit()

方法2:直接使用GLM类(对应R的矩阵输入形式)

如果想完全复刻R中用矩阵传入成功数和失败数的写法,可以绕过公式接口,直接使用sm.GLM,传入二维数组作为响应变量:

import pandas as pd
import statsmodels.api as sm
binom = sm.families.Binomial()

tbTest = pd.DataFrame({
  'x'    : [1, 2, 3, 4, 5, 6],
  'succ' : [5, 4, 3, 2, 1, 0],
  'fail' : [1, 0, 1, 2, 2, 3],
})

# 构造带截距项的设计矩阵
X = sm.add_constant(tbTest['x'])
# 构造响应变量矩阵:每行对应[成功数, 失败数]
y = tbTest[['succ', 'fail']].values

model = sm.GLM(y, X, family=binom)
lrTest = model.fit()
print(lrTest.summary())

两种方法的计算结果和你在R中执行的glm(matrix(c(succ, fail), ncol=2) ~ x, data=tbTest, family="binomial")完全一致。

内容的提问来源于stack exchange,提问作者Igor F.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 06:47:02