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