在 GLM.jl 中仅指定目标变量
specify only target variable in GLM.jl
在中可以只指定带有公式对象的目标变量: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
但是,当然,在实践中应该使用具有更多字段的DataFrame。
更改 GLM.jl
以包含点符号也不应该这么难,但请注意,需要在点具有具体含义之前将公式附加到 DataFrame,也许这就是迄今为止避免它的原因。
在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
但是,当然,在实践中应该使用具有更多字段的DataFrame。
更改 GLM.jl
以包含点符号也不应该这么难,但请注意,需要在点具有具体含义之前将公式附加到 DataFrame,也许这就是迄今为止避免它的原因。