【问题标题】:Julia: Creating a method for a subtype (LinearModel)Julia:为子类型创建方法(LinearModel)
【发布时间】:2018-08-08 12:20:00
【问题描述】:

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

我必须指定整个类型吗?

【问题讨论】:

    标签: types julia glm


    【解决方案1】:

    你应该指定类型有点不同:

    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 导出的函数名称冲突。

    【讨论】:

    • 感谢您提供这些答案和建议(您说得对)!但是如何指定 LinearModel 子类型,所以该函数不是对所有 GLM 通用,而是对 LM 通用?
    • 如果这是您想要的,那么我认为这将在方法签名中使用StatsModels.DataFrameRegressionModel{<:GLM.LinearModel}。编辑:那么即使您使用glm 函数创建线性模型,它也会被视为 GLM 而不是 LM,并且不会被您的函数接受。
    猜你喜欢
    • 2021-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-15
    相关资源
    最近更新 更多