使用rpy2调整lmer随机效应

mnemlml8  于 2022-12-06  发布在  其他
关注(0)|答案(1)|浏览(194)

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

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

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

在这个问题Replace lmer coefficients in R中解决了同样的问题,但是在这个例子中我使用了rpy 2。所以,我想知道当使用rpy 2时如何改变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
eqfvzcg8

eqfvzcg81#

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]

相关问题