【问题标题】:Replace lmer coefficients using rpy2使用 rpy2 替换 lmer 系数
【发布时间】:2022-11-29 10:44:26
【问题描述】:

我正在使用 lmer 模型 (https://fhernanb.github.io/libro_modelos_mixtos/pac-lme4.html) 来模拟不同国家不同产品的价格弹性。在使用历史数据训练模型后,有时其中一些产品的弹性是正的(根据定义它应该是负的或者仅仅是由于业务限制)。所以我需要手动调整一些系数,只有那些没有意义的系数。我的模型是:

model_str = """
                log(units)~
                log(price_usd) + (log(price_usd)|sku/country)

"""
model = lmerTest.lmer(model_str, data = df)

在这个问题Replace lmer coefficients in R 中解决了同样的问题,但在这种情况下我使用的是 rpy2。所以,我想知道如何在使用 rpy2 时更改 lmer 模型的系数。

为了用 R 改变系数:

library(lme4)
fm1 <- lmer(Reaction ~ Days + (Days | Subject), sleepstudy)
summary(fm1)$coef
#             Estimate Std. Error   t value
#(Intercept) 251.40510   6.823773 36.842535
#Days         10.46729   1.545958  6.770744

fm1@beta[names(fixef(fm1)) == "Days"] <- 0
summary(fm1)$coef
#            Estimate Std. Error  t value
#(Intercept) 251.4051   6.823773 36.84253
#Days          0.0000   1.545958  0.00000

【问题讨论】:

  • 如果您还在寻找这个,这是为了演示目的还是为了重新分析目的?
  • @kesh 抱歉,但我不确定我是否理解您的评论。我需要一个能够根据某个国家/地区的产品价格预测单位的模型。所以我不想有任何具有正价格弹性的产品。
  • 如果您只是想修改报告的输出数字,最简单的方法是将 summary(fm1)$coefcoef 数据框转换为 Pandas 数据框,然后修改并打印它。
  • 我明白,但事实并非如此。我需要修改模型对象来预测。
  • 知道了。就我而言,这是一个糟糕的词选择(“重新分析”),但这就是我的意思(也许“后分析”可能是一个更好的术语?)让我看一下。

标签: r statistics linear-regression lme4 rpy2


【解决方案1】:

lmer 返回一个所谓的 RS4 类对象,其类“属性”(在 Python 术语中)称为“插槽”,您可以使用 do_slotdo_slot_assign 函数访问它们。

这是一个基于 lme4 示例的小示例:

from rpy2.robjects.packages import importr, isinstalled, PackageData
from rpy2.rinterface import FloatSexpVector

utils = importr('utils')
lme4 = importr('lme4')

sleepstudy = next(PackageData('lme4').fetch("sleepstudy").values())
formula = "Reaction ~ Days + (Days | Subject)"
fm1 = lmer(formula=formula, data=sleepstudy)

# get names of the "slots"
list(fm1.slotnames())

# prints: ['resp', 'Gp', 'call', 'frame', 'flist', 'cnms', 'lower', 'theta', 'beta', 'u', 'devcomp', 'pp', 'optinfo']

# get value of a slot
fm1.do_slot('beta')
# prints: [251.405105, 10.467286]

# to set a slot value (beta to a zero vector)
fm1.do_slot_assign('beta',FloatSexpVector([0,0]))

# check the new value
fm1.do_slot('beta')
# prints: [251.405105, 10.467286]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-23
    • 2020-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多