# How do I a logistic regression without the intercept in GLM.jl?

I can’t figure out how to fit a model without the intercept

The documentatioin just says the intercept is fitted by default but doesn’t show how too do it without the intercept? is that even possible?

``````using StatsModels

#e.g.

formula = Term(:target) ~ term(-1) + sum(Term.(Symbol.(names(last_2_years4[:, Not(:target)]))))
``````

I answered in the other thread - here are two options with or without the `@formula` macro:

``````julia> using GLM

julia> df = (x = rand(10), y = rand(Bool, 10));

julia> glm(@formula(y ~ 0 + x), df, Bernoulli(), LogitLink())
StatsModels.TableRegressionModel{GeneralizedLinearModel{GLM.GlmResp{Vector{Float64}, Bernoulli{Float64}, LogitLink}, GLM.DensePredChol{Float64, LinearAlgebra.CholeskyPivoted{Float64, Matrix{Float64}, Vector{Int64}}}}, Matrix{Float64}}

y ~ 0 + x

Coefficients:
──────────────────────────────────────────────────────────────
Coef.  Std. Error      z  Pr(>|z|)  Lower 95%  Upper 95%
──────────────────────────────────────────────────────────────
x  -1.32166     1.47523  -0.90    0.3703   -4.21306    1.56975
──────────────────────────────────────────────────────────────

julia> glm(reshape(df.x, 10, 1), df.y, Bernoulli(), LogitLink())
GeneralizedLinearModel{GLM.GlmResp{Vector{Float64}, Bernoulli{Float64}, LogitLink}, GLM.DensePredChol{Float64, LinearAlgebra.CholeskyPivoted{Float64, Matrix{Float64}, Vector{Int64}}}}:

Coefficients:
───────────────────────────────────────────────────────────────
Coef.  Std. Error      z  Pr(>|z|)  Lower 95%  Upper 95%
───────────────────────────────────────────────────────────────
x1  -1.32166     1.47523  -0.90    0.3703   -4.21306    1.56975
───────────────────────────────────────────────────────────────
``````

I want the terms to be constructed programmatically

Ah, that wasn’t clear from this question or the other thread, where the discussion was around using the `lm` function.

If you want to translate something you know how to write in `@formula` syntax into code, expanding the macro is helpful:

``````julia> @macroexpand(@formula(y ~ 0 + x))
:(StatsModels.Term(:y) ~ StatsModels.ConstantTerm(0) + StatsModels.Term(:x))
``````

Also, `term` is the preferred function for construcing `Term` objects, as it will accept strings so you can do `term.(names(df[!, Not(:target)]))`

1 Like