Types Julia:为子类型(LinearModel)创建方法

Types Julia:为子类型(LinearModel)创建方法,types,julia,glm,Types,Julia,Glm,我正在尝试为GLM包的LinearModel子类型创建一个方法。不幸的是,这似乎不起作用: using DataFrames, GLM, RDatasets iris = dataset("datasets", "iris") fit = lm(@formula(SepalLength ~ PetalWidth), iris) function print_r2(fit::GLM.LinearModel) R2 = r2(fit) println("The model's

我正在尝试为GLM包的LinearModel子类型创建一个方法。不幸的是,这似乎不起作用:

using DataFrames, GLM, RDatasets

iris = dataset("datasets", "iris")

fit = lm(@formula(SepalLength ~ PetalWidth), iris)

function print_r2(fit::GLM.LinearModel)

    R2 = r2(fit)
    println("The model's R2 is $R2.")

end

print_r2(fit)
和错误:

MethodError: no method matching print_r2(::StatsModels.DataFrameRegressionModel{GLM.LinearModel{GLM.LmResp{Array{Float64,1}},GLM.DensePredChol{Float64,Base.LinAlg.Cholesky{Float64,Array{Float64,2}}}},Array{Float64,2}})
Closest candidates are:
  print_r2(::GLM.LinearModel) at In[1]:9

我必须指定整个类型吗

您应该以稍微不同的方式指定类型:

import StatsBase

function print_r2(fit::StatsBase.RegressionModel)
    R2 = r2(fit)
    println("The model's R2 is $R2.")
end
或者
fit::StatsModels.DataFrameRegressionModel
,如果您想更具体一些

问题是您的
fit
不是
GLM.LinearModel
类型:

julia> fit isa GLM.LinearModel
false
您可以按如下方式检查其类型:

julia> typeof(fit)
StatsModels.DataFrameRegressionModel{GLM.LinearModel{GLM.LmResp{Array{Float64,1}},GLM.DensePredChol{Float64,Base.LinAlg.Cholesky{Float64,Array{Float64,2}}}},Array{Float64,2}}

作为旁注:
fit
不是一个非常幸运的名称,因为它与由
StatsBase

导出的函数名冲突。您应该以稍微不同的方式指定类型:

import StatsBase

function print_r2(fit::StatsBase.RegressionModel)
    R2 = r2(fit)
    println("The model's R2 is $R2.")
end
或者
fit::StatsModels.DataFrameRegressionModel
,如果您想更具体一些

问题是您的
fit
不是
GLM.LinearModel
类型:

julia> fit isa GLM.LinearModel
false
您可以按如下方式检查其类型:

julia> typeof(fit)
StatsModels.DataFrameRegressionModel{GLM.LinearModel{GLM.LmResp{Array{Float64,1}},GLM.DensePredChol{Float64,Base.LinAlg.Cholesky{Float64,Array{Float64,2}}}},Array{Float64,2}}

作为旁注:
fit
不是一个非常幸运的名称,因为它与
StatsBase

导出的函数名冲突。感谢您的回答和建议(您对fit名称的看法是正确的)!!但是如何指定LinearModel子类型,使该函数不是所有GLM通用的,而是仅适用于LMs?如果这是您想要的,那么我认为这将起作用
StatsModels.DataFrameRegressionModel{感谢您的回答和建议(您对fit name的看法是正确的)!!但是如何指定LinearModel子类型,使函数不是所有GLM通用的,而是仅适用于LMs?如果这是您想要的,那么我认为这将起作用
StatsModels.DataFrameRegressionModel{