繁体   English   中英

将混合效果模型公式从 R (lme4) 重写为 Julia

[英]Rewriting Mixed effects model formula from R (lme4) to Julia

我想获得在朱莉娅的结果相同使用功能的11聚物从lme4在河库请看以下和例如在内置的mtcars数据集,使用R

library(lme4)
data<-mtcars    
data$vs<-as.factor(data$vs)
data$am<-as.factor(data$am)
data$gear<-as.factor(data$gear)
str(data)
model <- lmer(mpg ~ cyl:gear + hp:am + (1|gear:am), data = data)

我从用于 Julia 的MixedModels包中找到了lmm()函数,它应该能够运行相同的结果,但是我不知道如何使用lmm()lmer()函数的第一个参数重写公式。 尤其是交互 (:) 运算符。

我将不胜感激用简短的例子回答。

这里的 R 和 Julia 模型之间的对应关系似乎并不准确。 还有不同数值算法的问题。 但是我尝试使用MixedModels重新创建相同的模型如下:

using RDatasets
using MixedModels

mtcars = dataset("datasets","mtcars")
mtcars[:AM] = PooledDataArray(mtcars[:AM])
mtcars[:Gear] = PooledDataArray(mtcars[:Gear])
mtcars[:GearAM] = PooledDataArray(collect(zip(mtcars[:Gear],mtcars[:AM])))
m = fit!(lmm(MPG ~ 1 + Gear + AM + Cyl + HP + (1|GearAM),mtcars))

手动创建混合效果列很笨拙 - 也许有更好的方法。 请注意命名 R 和 Julia 之间的系数的差异。 两者都有 6 个固定效应系数。

Julia 中的解决方案似乎不同(在我的机器上),但实现了更好的对数似然。 随机效应预计很弱,因为它的变量已经存在于固定效应中(它只考虑了 Gear 和 AM 之间的依赖关系),并且只有 32 个数据点。

希望这会有所帮助,如果您有更好的理解,最好将其添加到另一个答案或评论中。

Tl; DR

如果您使用REML=true@formula(MPG ~ 1 + Cyl & Gear + HP & AM + (1 | Gear & AM)您可以准确地重现。

更长的答案

支持(1 | Gear & AM)需要版本 3 或更高版本的 MixedModels.jl,截至目前(2020 年 8 月)尚未发布,因此要重现此内容,您需要使用pkg"add MixedModels#master"安装它。 这是在 Julia 1.5.0 上运行的:

using RDatasets, MixedModels
mtcars = RDatasets.dataset("datasets","mtcars")
categorical!(mtcars, [:AM, :Gear])
m = fit(MixedModel, 
        @formula(MPG ~ Cyl & Gear + HP & AM + (1 | Gear & AM)), 
        mtcars, 
        REML=true)

产生这个输出:

Linear mixed model fit by REML
 MPG ~ 1 + Cyl & Gear + HP & AM + (1 | Gear & AM)
 REML criterion at convergence: 168.11435769585046

Variance components:
             Column    Variance  Std.Dev. 
Gear & AM (Intercept)  16.913543 4.1126078
Residual                7.988539 2.8264004
 Number of obs: 32; levels of grouping factors: 4

  Fixed-effects parameters:
──────────────────────────────────────────────────────
                    Coef.  Std. Error      z  Pr(>|z|)
──────────────────────────────────────────────────────
(Intercept)    34.3507      3.50385     9.80    <1e-21
Cyl & Gear: 3  -1.08837     0.781649   -1.39    0.1638
Cyl & Gear: 4  -1.56833     0.875625   -1.79    0.0733
Cyl & Gear: 5  -0.167413    1.42839    -0.12    0.9067
HP & AM: 0     -0.0412826   0.0215381  -1.92    0.0553
HP & AM: 1     -0.0613247   0.0298067  -2.06    0.0396
──────────────────────────────────────────────────────

与您发布的R代码相比:

Linear mixed model fit by REML ['lmerMod']
Formula: mpg ~ cyl:gear + hp:am + (1 | gear:am)
   Data: data

REML criterion at convergence: 168.1

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-1.42280 -0.54922 -0.07898  0.54892  2.09217 

Random effects:
 Groups   Name        Variance Std.Dev.
 gear:am  (Intercept) 16.914   4.113   
 Residual              7.989   2.826   
Number of obs: 32, groups:  gear:am, 4

Fixed effects:
            Estimate Std. Error t value
(Intercept) 34.35066    3.50385   9.804
cyl:gear3   -1.08837    0.78165  -1.392
cyl:gear4   -1.56833    0.87562  -1.791
cyl:gear5   -0.16741    1.42839  -0.117
hp:am0      -0.04128    0.02154  -1.917
hp:am1      -0.06132    0.02981  -2.057

不修改数据

您还可以通过为它们提供对比来控制哪些变量被视为分类变量:

m2 = fit(MixedModel,
         @formula(MPG ~ Cyl & Gear + HP & AM + (1 | Gear & AM)),
         mtcars,
         REML=true,
         contrasts = Dict(:AM => DummyCoding(), :Gear => DummyCoding()))

解释

指定 R 和 Julia(使用StatsModels.jl )之间的回归公式有两个主要区别。

  1. 在 Julia 中,您使用&来创建术语之间的交互,但在 R 中,您使用:
  2. 在 Julia 中,您必须明确说明您正在使用@formula宏定义一个公式。 在 R 中,通过“非标准评估”的魔力,任何事物都可能是一个宏。

因此,您模型的等效 Julia 公式是

@formula(mpg ~ cyl&gear + hp&am + (1|gear&am))

对于使用categorical! 要将 DataFrame 中的列转换为分类列,请参阅DataFrames.jl 文档

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM