如何将Python逻辑回归结果导入R(无需CSV中转)
解决R中reticulate导入Python逻辑回归结果的问题
问题背景
因Python具备更强的多核运行能力与内存效率,希望在Python中执行逻辑回归分析,再将结果摘要导入R(最终用于Quarto文档)。但使用reticulate包导入结果时失败,且希望避免通过CSV文件中转数据。
问题分析
原代码存在两个核心问题:
- 不必要地通过CSV中转数据,增加IO开销
- 未正确从Python代码中返回结构化的模型结果,导致R无法直接读取statsmodels的模型/摘要对象
解决方案
利用reticulate的跨语言变量访问能力,直接在Python中读取R的数据集;同时在Python里将模型系数整理为结构化DataFrame,返回后在R中直接处理。
完整修正代码
## 加载所需包 library(tidyverse) library(broom) library(gt) library(reticulate) library(ISLR) ## 预处理数据集:无需写入CSV test_data <- ISLR::OJ %>% select(Purchase, PriceCH, SpecialCH, Store7) %>% mutate(Purchase = if_else(Purchase == 'CH', 1, 0)) %>% as_tibble() ## 执行Python逻辑回归并返回结构化结果 py_coef_df <- py_run_string(" import pandas as pd import statsmodels.api as sm # 直接读取R环境中的test_data,无需CSV中转 data = r.test_data.copy() # 定义因变量与自变量 y = data['Purchase'] X = data[['PriceCH', 'SpecialCH', 'Store7']] # 处理分类变量,生成哑变量 X = pd.get_dummies(X, columns=['Store7'], drop_first=True) # 添加回归常数项 X = sm.add_constant(X) # 拟合逻辑回归模型 model = sm.Logit(y, X).fit() # 整理为类似broom::tidy()的结构化DataFrame coef_df = pd.DataFrame({ 'term': model.params.index, 'estimate': model.params.values, 'std.error': model.bse.values, 'statistic': model.tvalues.values, 'p.value': model.pvalues.values }) ", convert = TRUE)$coef_df ## 用gt格式化结果,与R原生glm输出风格一致 py_coef_df %>% gt() ## 对比R原生glm的输出效果 glm(Purchase ~ PriceCH + SpecialCH + Store7, data = test_data, family = binomial()) %>% tidy() %>% gt()
关键修改说明
- 移除CSV中转:通过
r.test_data让Python直接访问R环境中的数据集,省去文件读写步骤 - 结构化结果返回:在Python中将模型的系数、标准误、统计量、p值整理为DataFrame,R通过
convert = TRUE自动转为data.frame格式 - 兼容R的可视化流程:返回的DataFrame结构与
broom::tidy()输出一致,可直接用gt包格式化,完美适配Quarto文档需求
内容的提问来源于stack exchange,提问作者Justas Mundeikis
相关产品推荐
相关产品推荐

