【问题标题】:Retrieve statistics from R lm regression into pandas with rpy2使用 rpy2 从 R lm 回归中检索统计数据到 pandas
【发布时间】:2023-03-21 06:24:01
【问题描述】:

受到文档中linear models example 的启发,我想在运行lm 命令后打印一个漂亮的摘要。

当我运行时(见示例中的最后一行)

print(base.summary(stats.lm('foo ~ bar'))

我得到一个完整的函数列表,开头如下:

Call:
(function (formula, data, subset, weights, na.action, method = "qr", 
    model = TRUE, x = FALSE, y = FALSE, qr = TRUE, singular.ok = TRUE, 
    contrasts = NULL, offset, ...) 
{
    ret.x <- x
    ret.y <- y
    cl <- match.call()
    mf <- match.call(expand.dots = FALSE)

底部有所需的R 输出:

Coefficients:
         Estimate Std. Error t value Pr(>|t|)    
foo        5.0320     0.2202   22.85 9.55e-15 ***
bar        4.6610     0.2202   21.16 3.62e-14 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.6964 on 18 degrees of freedom
Multiple R-squared:  0.9818,    Adjusted R-squared:  0.9798 
F-statistic: 485.1 on 2 and 18 DF,  p-value: < 2.2e-16

这有一定的问题,但当提供给lm 的数据是pandas.DataFrame 时变得不可行,因为base.summary 似乎想要打印所有数据。

有没有办法在pd.DataFrame 中获得格式良好的R 输出而不需要所有额外的gubbins?

【问题讨论】:

  • broom R 中的包??
  • @Metrics 这看起来是个不错的选择。如果这个问题能让我了解rpy2 的情况,那就太好了。比如,我如何明确地处理来自lm 的返回类型?

标签: python r pandas rpy2


【解决方案1】:

为了后代,这是将数字从 lm 恢复到 pd.DataFrame 的非常好的方法(感谢 @Metrics 提供有关扫帚的提示)

def _run_regression(data, y_name):
    """
    Run a linear regression, in R, using `data` with dependent variable
    `y_name` and independent variables all other columns of `data`.
    """
    from rpy2.robjects.packages import importr
    stats = importr('stats')
    broom = importr('broom')
    lm = broom.tidy(stats.lm('%s ~ . ' % y_name, data=data))
    return _extract_R_df(lm).set_index('term')

def _extract_R_df(df):
    """
    Extract the R DataFrame `df` as a pd.DataFrame. This slightly
    longer method is necessary because `np.asarray(df)` drops the
    exponent on very small numbers!
    """
    return pd.DataFrame({name:np.asarray(df.rx(name))[0] for name in df.names})

这会导致类似于以下的 DataFrame:

                 estimate   p.value     statistic     std.error
term                                                           
(Intercept) -3.709995e-16  0.000056 -4.712554e+00  7.872579e-17
x_is         8.000000e-01  0.000000  1.067919e+16  7.491204e-17
v_is         2.000000e-01  0.000000  2.107838e+15  9.488394e-17
d_ij        -2.000000e-01  0.000000 -2.970482e+14  6.732913e-16
d1           1.000000e-01  0.000000  4.045155e+14  2.472093e-16
d2           3.000000e-01  0.000000  5.320521e+14  5.638545e-16
d3           7.000000e-01  0.000000  1.779338e+15  3.934048e-16

【讨论】:

    猜你喜欢
    • 2020-12-23
    • 2014-05-06
    • 2015-09-04
    • 1970-01-01
    • 2013-05-31
    • 1970-01-01
    • 1970-01-01
    • 2018-10-03
    • 1970-01-01
    相关资源
    最近更新 更多