Metaprogramming 在GLM.jl中仅指定目标变量

Metaprogramming 在GLM.jl中仅指定目标变量,metaprogramming,julia,Metaprogramming,Julia,在中,可以仅使用公式对象指定目标变量:y~。 这不适用于GLM.jl在R中,公式中的点表示法表示除依赖字段外的所有字段(在公式的左侧)。显然GLM.jl没有实现这种表示法,但可以更改 例如,以下函数使事情更接近R: using DataFrames # install with Pkg.add("DataFrames") using MacroTools # install with Pkg.add("MacroTools") function usedot!(f, df)

在中,可以仅使用公式对象指定目标变量:
y~。


这不适用于
GLM.jl

在R中,公式中的点表示法表示除依赖字段外的所有字段(在公式的左侧)。显然
GLM.jl
没有实现这种表示法,但可以更改

例如,以下函数使事情更接近R:

using DataFrames    # install with Pkg.add("DataFrames")
using MacroTools    # install with Pkg.add("MacroTools")

function usedot!(f, df)
    vs = collect(filter(x->x != f.lhs,names(df)))
    ex = length(vs)>1 ? Expr(:call,:+,vs...) : vs[1]
    f.rhs = MacroTools.postwalk(x -> x == :(:.) ? ex : x , f.rhs)
    f.rhs = MacroTools.postwalk(x -> typeof(x)==Expr &&
      x.head==:quote && length(x.args)==1 &&
      x.args[1] == :. ? ex : x , f.rhs)
    return f
end

usedot(f,df) = usedot!(DataFrames.Formula(f),df)
这些功能可按如下方式使用:

julia> using GLM, RDatasets

julia> form = dataset("datasets", "Formaldehyde");

julia> lm1 = fit(LinearModel, usedot(@formula(OptDen ~ :.),form), form)
DataFrames.DataFrameRegressionModel{GLM.LinearModel{GLM.LmResp{Array{Float64,1}},GLM.DensePredChol{Float64,Base.LinAlg.Cholesky{Float64,Array{Float64,2}}}},Array{Float64,2}}

Formula: OptDen ~ 1 + Carb

Coefficients:
               Estimate  Std.Error  t value Pr(>|t|)
(Intercept)  0.00508571 0.00783368 0.649211   0.5516
Carb           0.876286  0.0135345  64.7444    <1e-6
julia>使用GLM、rdataset
julia>form=数据集(“数据集”、“甲醛”);
julia>lm1=fit(LinearModel,usedot(@formula(OptDen~:),form),form)
DataFrames.DataFrameRegressionModel{GLM.LinearModel{GLM.LmResp{Array{Float64,1}},GLM.DensePredChol{Float64,Base.LinAlg.Cholesky{Float64,Array{Float64,2}},Array{Float64,2}
配方:OptDen~1+碳水化合物
系数:
估计标准误差t值Pr(>t)
(截距)0.00508571 0.00783368 0.649211 0.5516

Carb 0.876286 0.0135345 64.7444不确定问题是什么?请参见Dan belowSo的回答。到目前为止,我的印象是,
ScikitLearn.jl
是与数据帧集成的机器学习库。