我正在尝试为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
我必须指定整个类型吗?
答案 0 :(得分:2)
您应指定不同的类型:
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
导出的函数名称冲突。