如何在Julia中对GLM预测结果进行取整

如何在Julia中对GLM预测结果进行取整,julia,Julia,我试图对Julia做一个非常简单的逻辑回归。但朱莉娅的打字系统似乎给我带来了麻烦。基本上,glm predict给了我一系列概率。我想做一个简单的循环,如果概率>=0.5,它是1,否则是0。我希望这些标签也是整数 无论我做什么,我都无法将predict返回的DataArray转换为Int64。如果我创建一个临时数据数组,我就可以很好地对它进行取整。即使它们都显示一种类型的DataArray.DataArray{Float64,1}。我也尝试过pred>0.5之类的方法,但同样失败。显然,pred

我试图对Julia做一个非常简单的逻辑回归。但朱莉娅的打字系统似乎给我带来了麻烦。基本上,glm predict给了我一系列概率。我想做一个简单的循环,如果概率>=0.5,它是1,否则是0。我希望这些标签也是整数

无论我做什么,我都无法将predict返回的DataArray转换为Int64。如果我创建一个临时数据数组,我就可以很好地对它进行取整。即使它们都显示一种类型的DataArray.DataArray{Float64,1}。我也尝试过pred>0.5之类的方法,但同样失败。显然,predict的返回值具有某种魔力,超越了类型,这使得它不同于我的简短程序中的其他DataArray

using DataFrames;
using GLM;

df = readtable("./data/titanic-dataset.csv");

delete!(df, :PassengerId);
delete!(df, :Name);
delete!(df, :Ticket);
delete!(df, :Cabin);
pool!(df, [:Sex]);
pool!(df, [:Embarked]);
df[isna.(df[:Age]),:Age] = median(df[ .~isna.(df[:Age]),:Age])

model = glm(@formula(Survived ~ Pclass + Sex + Age + SibSp + Parch + Fare + Embarked), df, Binomial(), LogitLink());
pred = predict(model,df);

z = DataArray([1.0,2.0,3.0]);
println(typeof(z));
println(typeof(pred));
println(round.(Int64,z));  # Why does this work?
println(round.(Int64,pred)); # But this does not?
输出为:

DataArrays.DataArray{Float64,1}
DataArrays.DataArray{Float64,1}
[1, 2, 3]
MethodError: no method matching round(::Type{Int64}, ::DataArrays.NAtype)
Closest candidates are:
  round(::Type{T<:Integer}, ::Integer) where T<:Integer at int.jl:408
  round(::Type{T<:Integer}, ::Float16) where T<:Integer at float.jl:338
  round(::Type{T<:Union{Signed, Unsigned}}, ::BigFloat) where T<:Union{Signed, Unsigned} at mpfr.jl:214
  ...

Stacktrace:
 [1] macro expansion at C:\Users\JHeaton\.julia\v0.6\DataArrays\src\broadcast.jl:32 [inlined]
 [2] macro expansion at .\cartesian.jl:64 [inlined]
 [3] macro expansion at C:\Users\JHeaton\.julia\v0.6\DataArrays\src\broadcast.jl:111 [inlined]
 [4] _broadcast!(::DataArrays.##116#117{Int64,Base.#round}, ::DataArrays.DataArray{Int64,1}, ::DataArrays.DataArray{Float64,1}) at C:\Users\JHeaton\.julia\v0.6\DataArrays\src\broadcast.jl:67
 [5] broadcast!(::Function, ::DataArrays.DataArray{Int64,1}, ::Type{Int64}, ::DataArrays.DataArray{Float64,1}) at C:\Users\JHeaton\.julia\v0.6\DataArrays\src\broadcast.jl:169
 [6] broadcast(::Function, ::Type{T} where T, ::DataArrays.DataArray{Float64,1}) at .\broadcast.jl:434
 [7] include_string(::String, ::String) at .\loading.jl:515
DataArray.DataArray{Float64,1}
DataArray.DataArray{Float64,1}
[1, 2, 3]
MethodError:没有与round匹配的方法(::Type{Int64},::DataArrays.NAtype)
最接近的候选人是:

round(::键入{T当你在
z
中有
NA
s时,你不能创建整数。你可以
round.
它们(在这种情况下,你会得到
DataArray
Float
s),但是当你试图使它们
Int
时,它会抱怨,因为
NA
不能
Int64
。 取而代之的是

convert(DataArray{Int}, round.(z))

此外,最好使用包中的可用数据而不是计算机上的本地数据集发布示例。

如果
z
中有
NA
s,则无法创建整数。您可以
取整。
它们(在这种情况下,您将得到
DataArray
Float
s),但当您试图使它们
Int
时,它会抱怨,因为
NA
不能
Int64
。 取而代之的是

convert(DataArray{Int}, round.(z))

另外,最好使用包中的可用数据而不是计算机上的本地数据集发布示例。

坦率地说,Julia中缺失值的处理还不理想,但这是开发中最活跃的领域之一。谢谢,现在完全有意义了。当我的两个示例报告时,关于没有匹配方法签名的错误我猜Julia对于需要NA的集合有并行类型。与MATLAB有一整套处理NA的并行函数相反,这是完全正确的。不过,谢天谢地,我不会改变:坦率地说,Julia中缺失值的处理方法还不理想,但它是最有效的方法之一ve开发领域。谢谢,现在完全有意义了。当我的两个示例报告相同类型时,关于没有匹配方法签名的错误让我感到震惊。我猜Julia为需要NA的集合提供了并行类型。与MATLAB有一整套并行函数来处理NA不同。这完全正确。我没有不过,谢天谢地,情况会有所改变: