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