如何估计Julia中的许多GLM模型?

如何估计Julia中的许多GLM模型?,julia,Julia,我有一个5000个变量的数据集。一个目标和4999个协变量。我想估计每个目标变量组合(4999个模型)有一个glm 如果不为GLM手动键入4999个公式,我如何做到这一点 在R中,我只需定义一个4999个字符串的列表(“target~x1”),将每个字符串转换为一个公式,并使用map来估计多个glm。Julia中是否有类似的操作?或者是否有一个优雅的替代方法 预先感谢。 < p>可以通过术语对象编程创建公式。可以找到该文档的文档,但请考虑下面的简单示例,以满足您的需要: 从虚拟数据开始 juli

我有一个5000个变量的数据集。一个目标和4999个协变量。我想估计每个目标变量组合(4999个模型)有一个glm

如果不为GLM手动键入4999个公式,我如何做到这一点

在R中,我只需定义一个4999个字符串的列表(“target~x1”),将每个字符串转换为一个公式,并使用map来估计多个glm。Julia中是否有类似的操作?或者是否有一个优雅的替代方法


预先感谢。

< p>可以通过<代码>术语对象编程创建公式。可以找到该文档的文档,但请考虑下面的简单示例,以满足您的需要:

从虚拟数据开始

julia> using DataFrames, GLM

julia> df = hcat(DataFrame(y = rand(10)), DataFrame(rand(10, 5)))
10×6 DataFrame
│ Row │ y         │ x1        │ x2       │ x3        │ x4         │ x5       │
│     │ Float64   │ Float64   │ Float64  │ Float64   │ Float64    │ Float64  │
├─────┼───────────┼───────────┼──────────┼───────────┼────────────┼──────────┤
│ 1   │ 0.0200963 │ 0.924856  │ 0.947904 │ 0.429068  │ 0.00833488 │ 0.547378 │
│ 2   │ 0.169498  │ 0.0915296 │ 0.375369 │ 0.0341015 │ 0.390461   │ 0.835634 │
│ 3   │ 0.900145  │ 0.502495  │ 0.38106  │ 0.47253   │ 0.637731   │ 0.814095 │
│ 4   │ 0.255163  │ 0.865253  │ 0.791909 │ 0.0833828 │ 0.741899   │ 0.961041 │
│ 5   │ 0.651996  │ 0.29538   │ 0.161443 │ 0.23427   │ 0.23132    │ 0.947486 │
│ 6   │ 0.305908  │ 0.170662  │ 0.569827 │ 0.178898  │ 0.314841   │ 0.237354 │
│ 7   │ 0.308431  │ 0.835606  │ 0.114943 │ 0.19743   │ 0.344216   │ 0.97108  │
│ 8   │ 0.344968  │ 0.452961  │ 0.595219 │ 0.313425  │ 0.102282   │ 0.456764 │
│ 9   │ 0.126244  │ 0.593456  │ 0.818383 │ 0.485622  │ 0.151394   │ 0.043125 │
│ 10  │ 0.60174   │ 0.8977    │ 0.643095 │ 0.0865611 │ 0.482014   │ 0.858999 │
现在,当您使用GLM运行线性模型时,您将执行类似于
lm(@formula(y~x1),df)的操作
,这确实不容易在循环中用于构造不同的公式。因此,我们将按照文档直接创建
@formula
宏的输出-记住Julia中的宏只是将语法转换为其他语法,所以它们不会做我们自己无法编写的任何事情

julia> lm(Term(:y) ~ Term(:x1), df)
StatsModels.TableRegressionModel{LinearModel{GLM.LmResp{Array{Float64,1}},GLM.DensePredChol{Float64,LinearAlgebra.Cholesky{Float64,Array{Float64,2}}}},Array{Float64,2}}

y ~ 1 + x1

Coefficients:
──────────────────────────────────────────────────────────────────────────
                 Coef.  Std. Error      t  Pr(>|t|)   Lower 95%  Upper 95%
──────────────────────────────────────────────────────────────────────────
(Intercept)   0.428436    0.193671   2.21    0.0579  -0.0181696   0.875041
x1           -0.106603    0.304597  -0.35    0.7354  -0.809005    0.595799
──────────────────────────────────────────────────────────────────────────
您可以自己验证上述内容是否等同于
lm(@formula(y~x1),df)

现在,希望这是构建您正在寻找的循环的一个简单步骤(限制为以下两个协变量以限制输出):


正如Dave在下面指出的那样,在这里使用
term()
函数来创建我们的术语,而不是直接使用
term()
构造函数是很有帮助的——这是因为
names(df)
返回
String
s的向量,而
term()
构造函数需要
Symbol
s.
term()
有一个用于自动处理转换的
字符串的方法。

您也可以使用低级API,将因变量作为向量传递,将自变量作为矩阵直接传递,而无需构建公式。您将丢失系数名称,但因为每个模型中只有一个自变量可能没问题


这记录在中。对每个模型的调用将类似于
glm([ones(length(x1))x1],target,dist)
。满列的1用于截取。

此处不一定相关,但您可以使用“小写”“
term
函数,而不是直接使用
term
构造函数,如果您的术语包含用于截取的
1
。它还通过任何
AbstractTerm
unchanged传递。受这个问题的启发,我创建了一个pull请求,该请求应该很快合并(这意味着),因此从StatsModels的v0.6.14开始,您可以直接执行
术语(名称(df))
,并且
术语将字符串转换为符号,因为您可能值得编辑您的答案以反映这一点?0.6.14现已发布

julia> for x ∈ names(df[:, Not(:y)])[1:2]
           @show lm(term(:y) ~ term(x), df)
       end
lm(term(:y) ~ term(x), df) = StatsModels.TableRegressionModel{LinearModel{GLM.LmResp{Array{Float64,1}},GLM.DensePredChol{Float64,LinearAlgebra.Cholesky{Float64,Array{Float64,2}}}},Array{Float64,2}}

y ~ 1 + x1

Coefficients:
──────────────────────────────────────────────────────────────────────────
                 Coef.  Std. Error      t  Pr(>|t|)   Lower 95%  Upper 95%
──────────────────────────────────────────────────────────────────────────
(Intercept)   0.428436    0.193671   2.21    0.0579  -0.0181696   0.875041
x1           -0.106603    0.304597  -0.35    0.7354  -0.809005    0.595799
──────────────────────────────────────────────────────────────────────────
lm(Term(:y) ~ Term(x), df) = StatsModels.TableRegressionModel{LinearModel{GLM.LmResp{Array{Float64,1}},GLM.DensePredChol{Float64,LinearAlgebra.Cholesky{Float64,Array{Float64,2}}}},Array{Float64,2}}

y ~ 1 + x2

Coefficients:
─────────────────────────────────────────────────────────────────────────
                 Coef.  Std. Error      t  Pr(>|t|)  Lower 95%  Upper 95%
─────────────────────────────────────────────────────────────────────────
(Intercept)   0.639633    0.176542   3.62    0.0068   0.232527    1.04674
x2           -0.502327    0.293693  -1.71    0.1256  -1.17958     0.17493
─────────────────────────────────────────────────────────────────────────