是否可以使用Python绘制R glmer模型预测?

时间:2019-05-04 00:22:05

标签: python r plot lme4 sjplot

我在R中有一个glmer模型,我想为此绘制预测。我从sjPlot库中找到了plot_model函数,并且工作正常。

这是MWE:

library(lattice)

cbpp$response <- sample(c(0,1), replace=TRUE, size=nrow(cbpp))
gm1 <- glmer(response ~ size + incidence + (1 | herd),
              data = cbpp, family = binomial)

例如,调用plot_model(gm1, type = "pred", show.data = TRUE)将产生下图:

enter image description here

但是,我对R并不熟悉,而且在尝试控制绘图的美观性并将多个模型绘制到同一图形中时遇到了很多困难(已经问过有关该问题here的问题)。我熟悉Python和matplotlib,让这些数据在Python环境下工作对我来说要简单得多。

我猜想一种实现此目的的方法是从R中获取y值(预测的开火概率)并导出它们,以便我可以在Python中读取它们,以便针对每个变量(evi prev)绘制它们例。但是,我不确定如何执行此操作。此外,我尝试阅读sjPlot源代码以弄清楚它如何绘制预测,但也无法弄清楚。

2 个答案:

答案 0 :(得分:2)

最简单的方法可能是使用ggeffects::ggpredict()

类似

library(ggeffects)
pred_frame <- ggpredict(myModel, term="evi_prev")

应产生一个具有预测,较低和较高置信度水平的数据帧。我不确定是否会在x轴上预测均匀间隔的值(这很好),还是不确定如何诱使它这样做。 (如果您提供一个可复制的示例,我可能会尝试一下。)

使用您发布的MWE确实表明,很难获得均匀分布值的预测(或更普遍的是,原始数据中没有的值);我尝试过类似terms="size [1:35]"之类的事情,但这限制了预测值的范围而不是将其填充。

基本上,可以使用predict()对象的内置merMod方法(可能与newdata一起指定例如均匀间隔的值)来获得预测[使用{{1} }获得有关概率而非对数标度的预测];置信区间较难,但可以通过显示here

的配方生成

答案 1 :(得分:2)

ggpredict()实际上会返回更多值(沿x轴,即所讨论的术语-在您的示例中为size-这些字符是偶数行),但是只有 prints < / em>更少的值。

library(lme4)
#> Loading required package: Matrix
library(ggeffects)

cbpp$response <- sample(c(0,1), replace=TRUE, size=nrow(cbpp))
gm1 <- glmer(response ~ size + incidence + (1 | herd), data = cbpp, family = binomial)

pr1 <- ggpredict(gm1, term = "size")

pr1
#> 
#> # Predicted probabilities of response
#> # x = size
#> 
#>   x predicted std.error conf.low conf.high
#>   2     0.632     0.717    0.297     0.875
#>   6     0.610     0.550    0.347     0.821
#>  10     0.587     0.407    0.390     0.759
#>  14     0.563     0.321    0.407     0.708
#>  18     0.539     0.339    0.376     0.695
#>  22     0.515     0.448    0.306     0.719
#>  26     0.491     0.601    0.229     0.758
#>  34     0.444     0.951    0.110     0.837
#> 
#> Adjusted for:
#> * incidence = 1.77
#> *      herd = 0 (population-level)
#> Standard errors are on link-scale (untransformed).

as.data.frame(pr1)
#>     x predicted std.error  conf.low conf.high group
#> 1   2 0.6323758 0.7168742 0.2967912 0.8751705     1
#> 2   4 0.6211339 0.6316777 0.3221952 0.8497229     1
#> 3   6 0.6097603 0.5501862 0.3470481 0.8212222     1
#> 4   8 0.5982662 0.4743133 0.3701925 0.7904902     1
#> 5  10 0.5866630 0.4072118 0.3898523 0.7592017     1
#> 6  12 0.5749627 0.3539066 0.4033525 0.7302266     1
#> 7  14 0.5631779 0.3213384 0.4071542 0.7076259     1
#> 8  16 0.5513213 0.3159857 0.3981187 0.6953669     1
#> 9  18 0.5394060 0.3391396 0.3759558 0.6947993     1
#> 10 20 0.5274456 0.3857000 0.3438768 0.7038817     1
#> 11 22 0.5154536 0.4484344 0.3063836 0.7192510     1
#> 12 24 0.5034437 0.5215385 0.2672889 0.7380720     1
#> 13 26 0.4914299 0.6012416 0.2292244 0.7584368     1
#> 14 28 0.4794260 0.6852450 0.1938167 0.7791488     1
#> 15 30 0.4674458 0.7721464 0.1619513 0.7994688     1
#> 16 32 0.4555030 0.8610687 0.1339908 0.8189431     1
#> 17 34 0.4436111 0.9514457 0.1099435 0.8373008     1

reprex package(v0.2.1)于2019-05-06创建

有一些小插图显示了程序包的不同功能,this one here演示了如何计算特定值/焦点术语级别的边际效应。

Ben发表的食谱显示了如何计算置信区间(以随机效应为条件或不以条件为条件),在ggpredict()中实现,这是一个简短的小插曲,解释了差异is here