Statistics 试图理解线性回归代码(GLM包)中的Julia语法

Statistics 试图理解线性回归代码(GLM包)中的Julia语法,statistics,julia,Statistics,Julia,这里是Total Julia noob(具备Python的基本知识)。我正在尝试做线性回归,我读到的东西建议使用GLM软件包。以下是我找到的一些示例代码: 有人能解释一下这里的语法吗?@公式是什么意思?文件说@foo意味着 我猜宏基本上只是一个函数,但是我在哪里可以找到函数/宏公式?不过,只要看看这里的用法,我会认为它可能是将y~x1+x2(不管是什么)作为公式参数传递给lm?(类似于python中的关键字参数=) 接下来,这里的~是什么?一般的医生说~意味着否定,但我不明白这是怎么回事 GLM

这里是Total Julia noob(具备Python的基本知识)。我正在尝试做线性回归,我读到的东西建议使用GLM软件包。以下是我找到的一些示例代码:

有人能解释一下这里的语法吗?
@公式
是什么意思?文件说
@foo
意味着 我猜宏基本上只是一个函数,但是我在哪里可以找到函数/宏
公式
?不过,只要看看这里的用法,我会认为它可能是将
y~x1+x2
(不管是什么)作为
公式
参数传递给
lm
?(类似于python中的关键字参数
=

接下来,这里的
~
是什么?一般的医生说
~
意味着否定,但我不明白这是怎么回事


GLM文档中是否有解释所有这些内容的地方?我没看到。只看到了几个例子,但没有看到每个函数及其所有参数的完整分解

您偶然发现了在包中定义并在Julia生态系统中的许多统计/计量经济学相关包中实施的

正如您所说,
@formula
是一个宏,它将给定给它的表达式(此处为
y~x1+x2
)转换为其他表达式。如果您想知道在Julia中调用宏时会发生什么-我承认这对新用户(有时是有经验的!)来说可能看起来很神奇-那么
@macroexpand
宏可以帮助您。在这种情况下:

julia> @macroexpand @formula(y ~ x1 + x2)
:(StatsModels.Term(:y) ~ StatsModels.Term(:x1) + StatsModels.Term(:x2))
上面的结果是由
@formula
宏构造的表达式。我们看到公式宏中的变量被转换为
StatsModels.Term
对象。如果我们直接使用
StatsModels
,我们可以通过以下方式自行构建:

julia> Term(:y) ~ Term(:x1) + Term(:x2)
FormulaTerm
Response:
  y(unknown)
Predictors:
  x1(unknown)
  x2(unknown)

julia> (Term(:y) ~ Term(:x1) + Term(:x2)) == @formula(y ~ x1 + x2)
true
现在是怎么回事,
~
,正如你所说,它可以在Julia中用于否定?这里发生的事情是,
StatsModels
~
定义了方法(在Julia中,这意味着本质上它是一个函数,可以写在参数之间,而不必用括号中的参数调用:

julia> (Term(:y) ~ Term(:x)) == ~(Term(:y), Term(:x))
true
因此,编写
y::Term~x::Term
与调用
~(y::Term,x::Term)
是一样的,这种调用
~
的方法是由
StatsModels
定义的(参见下面的方法6):

请注意,这里还可以找到一般的否定含义(上面的方法3,它定义了对布尔参数调用
~
的行为,并且在Base Julia中)

我同意GLM.jl文档可能不是世界上最全面的文档,但其中一个原因是
@formula
背后的整个机制实际上不是GLM.jl的东西-所以请查看上面链接的StatsModels文档,我认为它们非常好。

至于使用
~
的原因:这是我们的惯例。
julia> (Term(:y) ~ Term(:x)) == ~(Term(:y), Term(:x))
true
julia> methods(~)
# 6 methods for generic function "~":
[1] ~(x::BigInt) in Base.GMP at gmp.jl:542
[2] ~(::Missing) in Base at missing.jl:100
[3] ~(x::Bool) in Base at bool.jl:39
[4] ~(x::Union{Int128, Int16, Int32, Int64, Int8, UInt128, UInt16, UInt32, UInt64, UInt8}) in Base at int.jl:254
[5] ~(n::Integer) in Base at int.jl:138
[6] ~(lhs::Union{AbstractTerm, Tuple{Vararg{AbstractTerm,N}} where N}, rhs::Union{AbstractTerm, Tuple{Vararg{AbstractTerm,N}} where N}) in StatsModels at /home/nils/.julia/packages/StatsModels/pMxlJ/src/terms.jl:397