Revision 44fbd33f9511d5d15c3525ff921b6fb9683fd5be authored by Javier Barbero on 12 January 2022, 18:37:08 UTC, committed by Javier Barbero on 12 January 2022, 18:37:08 UTC
1 parent df8666d
dearussell.jl
``````# Tests for Russell DEA Models
@testset "RussellDEAModel" begin

# ------------------
# Input oriented
# ------------------
X = [2 2; 1 4; 4 1; 4 3; 5 5; 6 1; 2 5; 1.6 8]
Y = [1; 1; 1; 1; 1; 1; 1; 1]

# Input oriented CRS
dearussellio = dearussell(X, Y, orient = :Input, rts = :CRS)

@test typeof(dearussellio) == RussellDEAModel

@test nobs(dearussellio) == 8
@test ninputs(dearussellio) == 2
@test noutputs(dearussellio) == 1
@test efficiency(dearussellio, :X) ≈ [1 1; 1 1; 1 1; 0.5 2/3; 0.4 0.4; 2/3 1; 0.5 0.8; 0.625 0.5]
@test_throws ArgumentError efficiency(dearussellio, :Y) # No output efficiency in input oriented model
@test efficiency(dearussellio) ≈ [1; 1; 1; 0.5833333333333334; 0.4; 0.8333333333333334; 0.65; 0.5625]
@test convert(Matrix, peers(dearussellio)) ==
[ 1.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0
0.0  1.0  0.0  0.0  0.0  0.0  0.0  0.0
0.0  0.0  1.0  0.0  0.0  0.0  0.0  0.0
1.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0
1.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0
0.0  0.0  1.0  0.0  0.0  0.0  0.0  0.0
0.0  1.0  0.0  0.0  0.0  0.0  0.0  0.0
0.0  1.0  0.0  0.0  0.0  0.0  0.0  0.0]
@test slacks(dearussellio, :X) ≈ zeros(8,2) atol = 1e-10
@test slacks(dearussellio, :Y) ≈ zeros(8,1) atol = 1e-10

@test efficiency(dearussell(targets(dearussellio, :X), targets(dearussellio, :Y), orient = :Input, rts = :CRS)) ≈ ones(8,1)

# Test default is :Input with :CRS
efficiency(dearussell(X, Y)) == efficiency(dearussellio)

# Test no slacks
dearussellionoslack = dearussell(X, Y, slack = false)
@test efficiency(dearussellionoslack) == efficiency(dearussellio)
@test isempty(slacks(dearussellionoslack, :X)) == 1
@test isempty(slacks(dearussellionoslack, :Y)) == 1

# Input oriented VRS
dearusselliovrs  = dearussell(X, Y, orient = :Input, rts = :VRS)
@test efficiency(dearusselliovrs) ≈ [1; 1; 1; 0.5833333333333334; 0.4; 0.8333333333333334; 0.65; 0.5625]

## Test if one-by-one DEA using evaluation and reference sets match initial results
dearussell_io_ref_eff = zeros(size(X, 1))
dearussell_iovrs_ref_eff = zeros(size(X, 1))

Xref = X[:,:]
Yref = Y[:,:]

for i = 1:size(X, 1)
Xeval = X[i:i,:]
Xeval = Xeval[:,:]
Yeval = Y[i:i,:]
Yeval = Yeval[:,:]

dearussell_io_ref_eff[i] = efficiency(dearussell(Xeval, Yeval, orient = :Input, rts = :CRS, Xref = Xref, Yref = Yref))[1]
dearussell_iovrs_ref_eff[i] = efficiency(dearussell(Xeval, Yeval, orient = :Input, rts = :VRS, Xref = Xref, Yref = Yref))[1]
end

@test dearussell_io_ref_eff == efficiency(dearussellio)
@test dearussell_iovrs_ref_eff == efficiency(dearusselliovrs)

# Add new DMU with slack
dearussellioslack = dearussell([X; 2 2], [Y; 2], orient = :Input, rts = :VRS)
@test slacks(dearussellioslack, :Y) ≈ [1; 0; 0; 1; 1; 0; 0; 0; 0]

# Print
show(IOBuffer(), dearussellio)
show(IOBuffer(), dearussellionoslack)

# ------------------
# Output oriented
# ------------------
X = [1; 1; 1; 1; 1; 1; 1; 1]
Y = [7 7; 4 8; 8 4; 3 5; 3 3; 8 2; 6 4; 1.5 5]

# Output oriented CRS
dearusselloo = dearussell(X, Y, orient = :Output, rts = :CRS)

@test nobs(dearusselloo) == 8
@test ninputs(dearusselloo) == 1
@test noutputs(dearusselloo) == 2
@test efficiency(dearusselloo, :Y) ≈ [1 1; 1 1; 1 1; 7/3 1.4; 7/3 7/3; 1 2; 7/6 7/4; 46/9 1]
@test_throws ArgumentError efficiency(dearusselloo, :X) # No input efficiency in input oriented model
@test efficiency(dearusselloo) ≈ [1.0; 1.0; 1.0; 1.8666666666666665; 2.333333333333333; 1.5; 1.4583333333333335; 3.0555555555555554]
@test convert(Matrix, peers(dearusselloo)) ≈
[ 1.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0
0.0  1.0  0.0  0.0  0.0  0.0  0.0  0.0
0.0  0.0  1.0  0.0  0.0  0.0  0.0  0.0
1.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0
1.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0
0.0  0.0  1.0  0.0  0.0  0.0  0.0  0.0
1.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0
1/3  0.0  2/3  0.0  0.0  0.0  0.0  0.0] atol = 1e-10
@test slacks(dearusselloo, :X) ≈ zeros(8,1)
@test slacks(dearusselloo, :Y) ≈ zeros(8,2) atol = 1e-14

@test efficiency(dearussell(targets(dearusselloo, :X), targets(dearusselloo, :Y), orient = :Output, rts = :CRS)) ≈ ones(8,1)

# Test no slacks
dearusselloonoslack = dearussell(X, Y, orient = :Output, slack = false)
@test efficiency(dearusselloonoslack) == efficiency(dearusselloo)
@test isempty(slacks(dearusselloonoslack, :X)) == 1
@test isempty(slacks(dearusselloonoslack, :Y)) == 1

# Output oriented VRS
dearusselloovrs  = dearussell(X, Y, orient = :Output, rts = :VRS)
@test efficiency(dearusselloovrs) ≈ [1.0; 1.0; 1.0; 1.8666666666666665; 2.333333333333333; 1.5; 1.4583333333333335; 3.0555555555555554]

## Test if one-by-one DEA using evaluation and reference sets match initial results
dearussell_oo_ref_eff = zeros(size(X, 1))
dearussell_oovrs_ref_eff = zeros(size(X, 1))

Xref = X[:,:]
Yref = Y[:,:]

for i = 1:size(X, 1)
Xeval = X[i:i,:]
Xeval = Xeval[:,:]
Yeval = Y[i:i,:]
Yeval = Yeval[:,:]

dearussell_oo_ref_eff[i] = efficiency(dearussell(Xeval, Yeval, orient = :Output, rts = :CRS, Xref = Xref, Yref = Yref))[1]
dearussell_oovrs_ref_eff[i] = efficiency(dearussell(Xeval, Yeval, orient = :Output, rts = :VRS, Xref = Xref, Yref = Yref))[1]
end

@test dearussell_oo_ref_eff == efficiency(dearusselloo)
@test dearussell_oovrs_ref_eff == efficiency(dearusselloovrs)

# Add new DMU with slack
dearussellooslack = dearussell([X; 0.5], [Y; 7 7], orient = :Output, rts = :VRS)
@test slacks(dearussellooslack, :X) ≈ [0.5; 0; 0; 0.5; 0.5; 0; 0.5; 1/6; 0]

# Print
show(IOBuffer(), dearusselloo)
show(IOBuffer(), dearusselloonoslack)

# ------------------
# Graph
# ------------------
X = [2; 4; 8; 12; 6; 14; 14; 9.412]
Y = [1; 5; 8; 9; 3; 7; 9; 2.353]

# Graph CRS
dearussellgr = dearussell(X, Y, orient = :Graph, rts = :CRS)

@test nobs(dearussellgr) == 8
@test ninputs(dearussellgr) == 1
@test noutputs(dearussellgr) == 1
@test efficiency(dearussellgr, :X) ≈ [ 0.632455;
1.0;
0.894427;
0.774597;
0.632456;
0.632456;
0.717137;
0.447214] atol = 1e-5
@test efficiency(dearussellgr, :Y) ≈ [ 1.581139;
1.0;
1.118034;
1.290994;
1.581139;
1.581139;
1.394433;
2.236068] atol = 1e-5
@test efficiency(dearussellgr) ≈ [ 0.632455;
1.0;
0.894427;
0.774597;
0.632455;
0.632455;
0.717137;
0.447214] atol = 1e-5

@test isempty(slacks(dearussellgr, :X)) == 1
@test isempty(slacks(dearussellgr, :Y)) == 1

@test efficiency(dearussell(targets(dearussellgr, :X), targets(dearussellgr, :Y), orient = :Graph, rts = :CRS)) ≈ ones(8,1) atol = 1e-6

# Graph VRS
dearussellgrvrs  = dearussell(X, Y, orient = :Graph, rts = :VRS)

@test efficiency(dearussellgrvrs, :X) ≈ [  1.0;
1.0;
1.0;
1.0;
2/3;
0.571429;
0.857143;
0.424989] atol = 1e-5
@test efficiency(dearussellgrvrs, :Y) ≈ [ 1.0;
1.0;
1.0;
1.0;
5/3;
1.142857;
1.0;
2.124947] atol = 1e-5
@test efficiency(dearussellgrvrs) ≈ [ 1.0;
1.0;
1.0;
1.0;
0.633333;
0.723214;
0.928571;
0.447795] atol = 1e-5

## Test if one-by-one DEA using evaluation and reference sets match initial results
dearussell_gr_ref_eff = zeros(size(X, 1))
dearussell_grvrs_ref_eff = zeros(size(X, 1))

Xref = X[:,:]
Yref = Y[:,:]

for i = 1:size(X, 1)
Xeval = X[i:i,:]
Xeval = Xeval[:,:]
Yeval = Y[i:i,:]
Yeval = Yeval[:,:]

dearussell_gr_ref_eff[i] = efficiency(dearussell(Xeval, Yeval, orient = :Graph, rts = :CRS, Xref = Xref, Yref = Yref))[1]
dearussell_grvrs_ref_eff[i] = efficiency(dearussell(Xeval, Yeval, orient = :Graph, rts = :VRS, Xref = Xref, Yref = Yref))[1]
end

@test dearussell_gr_ref_eff == efficiency(dearussellgr)
@test dearussell_grvrs_ref_eff == efficiency(dearussellgrvrs)

# Print
show(IOBuffer(), dearussellgr)

# ------------------
# Test errors
# ------------------
@test_throws DimensionMismatch dearussell([1; 2 ; 3], [4 ; 5]) #  Different number of observations
@test_throws DimensionMismatch dearussell([1; 2], [4 ; 5], Xref = [1; 2; 3; 4]) # Different number of observations in reference sets
@test_throws DimensionMismatch dearussell([1 1; 2 2], [4 4; 5 5], Xref = [1 1 1; 2 2 2]) # Different number of inputs
@test_throws DimensionMismatch dearussell([1 1; 2 2], [4 4; 5 5], Yref = [4 4 4; 5 5 5]) # Different number of inputs
@test_throws ArgumentError dearussell([1; 2; 3], [4; 5; 6], orient = :Error) # Invalid orientation
@test_throws ArgumentError dearussell([1; 2; 3], [4; 5; 6], rts = :Error) # Invalid returns to scale

@test_throws ArgumentError efficiency(dearussellio, :Error) # Invalid efficiency type

end
``````

Computing file changes ...