Non-call expression encountered

Macroexpanding @formula shows that it just creates a call of ~, + etc on symbolic representations of Term objects, i.e.,

julia> @macroexpand @formula C ~ A + B
:(StatsModels.Term(:C) ~ StatsModels.Term(:A) + StatsModels.Term(:B))

Thus, we can just construct the desired expression directly using functions only

julia> using StatsModels

julia> my_formula = Term(:C) ~ +( (Term(Symbol(x)) for x ∈ names(df_test)[2:end])...)
FormulaTerm
Response:
  C(unknown)
Predictors:
  B(unknown)
  C(unknown)

julia> model_test = glm(my_formula, df_test, Binomial(), LogitLink())
StatsModels.TableRegressionModel{GeneralizedLinearModel{GLM.GlmResp{Vector{Float64}, Binomial{Float64}, LogitLink}, GLM.DensePredChol{Float64, LinearAlgebra.Cholesky{Float64, Matrix{Float64}}}}, Matrix{Float64}}

C ~ 1 + B + C

Alternatively, you can just pass the data as a design matrix and a target vector directly:

julia> model_test = glm(Matrix(df_test[:, 2:end]), df_test[:, :C], Binomial(), LogitLink())
GeneralizedLinearModel{GLM.GlmResp{Vector{Float64}, Binomial{Float64}, LogitLink}, GLM.DensePredChol{Float64, LinearAlgebra.Cholesky{Float64, Matrix{Float64}}}}:

In any case, you probably want 1:end-1 as otherwise C is regressed on C.

1 Like