2017-08-15 13 views
0

私はJuliaで非常に単純なロジスティック回帰をしようとしています。しかし、ジュリアのタイピングシステムが問題を引き起こしているようです。基本的に、glmの予測は私に確率の配列を与えます。確率> = 0.5の場合は1、それ以外の場合は0となるように単純なラウンドを行いたいと思います。これらのラベルも整数にしたいと思います。Juliaで予測されるGLMの結果を丸める方法

私が何をしても、予測によって返されたDataArrayをInt64に変換することはできません。私が特別なDataArrayを作成する場合、私はちょうど良いラウンドすることができます。両方ともDataArrays.DataArray {Float64,1}のタイプを示しています。私はまた、pred> 0.5のようなものを試しましたが、それは同様に失敗します。明らかに、私の短いプログラムの中で他の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 

答えて

2

あなたはzNA秒を持っているときは、整数を作成することはできません。 round.(その場合はDataArrayFloatになります)、IntにしようとするとNAInt64にはなりませんので、不平を言います。 代わりにまた

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

を行い、パッケージではなく、コンピュータのローカルのデータセットで利用可能なデータを使用した例を投稿することがよりよいです。

+1

真にJuliaの欠損値の治療はまだ理想的ではありませんが、開発の最も活発な分野の1つです。 –

+0

ありがとうございました。私の2つの例で同じタイプが報告されたときに、メソッドシグネチャが一致しないというエラーが表示されました。私はJuliaがNAを持っている必要があるコレクションの並列型を持っていると思う。 MATLABは、NAを処理するための関数の完全な並列セットを持っています。 – JeffHeaton

+0

それはまさに正しいことです。私は感謝して変更するつもりです:https://discourse.julialang.org/t/announcement-an-update-on-dataframes-future-plans/4646 –

関連する問題