types - 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
我必须指定整个类型吗?
解决方案
您应该稍微不同地指定类型:
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
。
推荐阅读
- android - 如何在不使用时区更新 Firestore 上检索日期?
- reactjs - React Typescript and Jest
- javascript - JavaScript check if several numbers within a set are within a certain range
- amazon-web-services - EC2 实例重启时发送 SNS 通知
- postgresql - 在 postgres 中加入带有未嵌套数组的表
- node.js - Using Promise and async together
- graphql - Access JSON chunk exported from Gatsby Static Query
- python - ZeroDivisionError: float division by zero?
- parsing - 如何在 Linux 日志上使用日志解析器(logpai)
- visual-studio-code - 如何让 VSCode 键绑定覆盖终端的键绑定?