首页 > 解决方案 > Julia:为子类型创建方法(LinearModel)

问题描述

我正在尝试为 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

我必须指定整个类型吗?

标签: typesjuliaglm

解决方案


您应该稍微不同地指定类型:

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


推荐阅读