using CSV
using DataFrames
using StringEncodings
using FixedEffectModels
using RegressionTables
using Plots
using LinearAlgebra
using Statistics
using Optim
using Printf
using ForwardDiff
using Random
using GLM
using Serialization
using Roots4 応用編
mutable struct datalist_struct
    X1::Array{Float64,2};
    X2::Array{Float64,2};
    Z::Array{Float64,2};
    ShareVec::Vector{Float64};
    marketIndex::Vector{Int64};
    logitshare::Vector{Float64};
    randomDrawMat::Array{Float64,2};
    marketIndexMat::BitMatrix
end
mutable struct parameter_struct
    Nsim::Int;
    T::Int;
    N::Int;
endfor file in readdir("functions/demand_estimation")
    include("functions/demand_estimation/" * file)
end4.1 データの読み込み
data = CSV.read("data/demand_estimation_merger/chap3_data.csv", DataFrame);
first(data, 5)5×61 DataFrame
| Row | NameID | year | Maker | Type | Name | Sales | Model | price | kata | FuelEfficiency | capacity | FuelType | HH | size | hppw | share | share0 | hppw_sum_own | FuelEfficiency_sum_own | size_sum_own | hppw_sqr_sum_own | FuelEfficiency_sqr_sum_own | size_sqr_sum_own | hppw_sum_mkt | FuelEfficiency_sum_mkt | size_sum_mkt | hppw_sqr_sum_mkt | FuelEfficiency_sqr_sum_mkt | size_sqr_sum_mkt | iv_BLP_own_hppw | iv_BLP_own_FuelEfficiency | iv_BLP_own_size | iv_BLP_other_hppw | iv_BLP_other_FuelEfficiency | iv_BLP_other_size | iv_BLP_own_num | iv_BLP_other_num | iv_GH_own_hppw | iv_GH_own_FuelEfficiency | iv_GH_own_size | iv_GH_other_hppw | iv_GH_other_FuelEfficiency | iv_GH_other_size | logit_share | iv_BLP_own_hppw_nest | iv_BLP_own_FuelEfficiency_nest | iv_BLP_own_size_nest | iv_BLP_other_hppw_nest | iv_BLP_other_FuelEfficiency_nest | iv_BLP_other_size_nest | iv_BLP_own_num_nest | iv_BLP_other_num_nest | iv_GH_own_hppw_nest | iv_GH_own_FuelEfficiency_nest | iv_GH_own_size_nest | iv_GH_other_hppw_nest | iv_GH_other_FuelEfficiency_nest | iv_GH_other_size_nest | sum_year_body | inside_share | log_inside_share | 
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Int64 | Int64 | String15 | String7 | String31 | Int64 | String | Float64 | String15 | Float64 | Int64 | String15 | Int64 | Float64 | Float64 | Float64 | Float64 | Float64 | Float64 | Float64 | Float64 | Float64 | Float64 | Float64 | Float64 | Float64 | Float64 | Float64 | Float64 | Float64 | Float64 | Float64 | Float64 | Float64 | Float64 | Int64 | Int64 | Float64 | Float64 | Float64 | Float64 | Float64 | Float64 | Float64 | Float64 | Float64 | Float64 | Float64 | Float64 | Float64 | Int64 | Int64 | Float64 | Float64 | Float64 | Float64 | Float64 | Float64 | Int64 | Float64 | Float64 | |
| 1 | 14 | 2011 | Audi | Foreign | A1シリーズ | 4206 | 1.4 TFSI | 2.99804 | DBA-8XCAX | 19.4 | 4 | ハイオク | 53783435 | 9.94723 | 0.102521 | 7.82025e-5 | 0.938981 | 0.299061 | 49.4 | 33.1397 | 0.0299428 | 831.48 | 369.074 | 1.93875 | 276.2 | 218.564 | 0.207044 | 4206.04 | 2550.97 | 0.19654 | 30.0 | 23.1925 | 15.7229 | 2464.5 | 1811.61 | 2 | 157 | 0.000154423 | 43.84 | 6.61965 | 0.216315 | 5703.33 | 1332.33 | -9.39325 | 0.19654 | 30.0 | 23.1925 | 1.63969 | 226.8 | 185.424 | 2 | 16 | 0.000154423 | 43.84 | 6.61965 | 0.00906462 | 596.48 | 76.1391 | 143357 | 0.0293393 | -3.52883 | 
| 2 | 14 | 2012 | Audi | Foreign | A1シリーズ | 4502 | 1.4 TFSI | 2.835 | DBA-8XCAX | 19.4 | 4 | ハイオク | 54171475 | 9.94723 | 0.102521 | 8.31065e-5 | 0.919762 | 0.309984 | 49.8 | 33.1791 | 0.0323769 | 842.36 | 370.051 | 1.83969 | 298.3 | 215.509 | 0.182524 | 4896.57 | 2484.02 | 0.207463 | 30.4 | 23.2319 | 16.1851 | 2659.3 | 1891.36 | 2 | 164 | 0.000348865 | 39.2 | 6.8118 | 0.22062 | 6457.49 | 1428.51 | -9.31175 | 0.207463 | 30.4 | 23.2319 | 1.5297 | 248.5 | 182.33 | 2 | 16 | 0.000348865 | 39.2 | 6.8118 | 0.00466326 | 434.17 | 69.7742 | 159210 | 0.0282771 | -3.5657 | 
| 3 | 14 | 2013 | Audi | Foreign | A1シリーズ | 5071 | 1.4 TFSI | 2.82326 | DBA-8XCAX | 19.4 | 4 | ハイオク | 54594744 | 9.94723 | 0.102521 | 9.28844e-5 | 0.919563 | 0.311828 | 52.7 | 33.5456 | 0.0327145 | 947.05 | 378.12 | 1.95986 | 334.4 | 228.399 | 0.196626 | 5760.2 | 2656.1 | 0.209307 | 33.3 | 23.5983 | 15.5385 | 2762.2 | 1857.63 | 2 | 161 | 0.000308215 | 31.37 | 7.59138 | 0.201628 | 6612.26 | 1400.56 | -9.2003 | 0.209307 | 33.3 | 23.5983 | 1.64803 | 281.7 | 194.853 | 2 | 17 | 0.000308215 | 31.37 | 7.59138 | 0.00467482 | 281.31 | 83.5873 | 191874 | 0.0264288 | -3.6333 | 
| 4 | 15 | 2006 | Audi | Foreign | A3シリーズ | 4830 | アトラクション | 2.91889 | GH-8PBSE | 12.2 | 5 | ハイオク | 51102005 | 10.8151 | 0.075 | 9.45168e-5 | 0.915228 | 0.163435 | 23.4 | 22.4202 | 0.0134458 | 274.28 | 251.645 | 1.97874 | 224.8 | 231.473 | 0.207998 | 2577.22 | 2715.96 | 0.0884354 | 11.2 | 11.6051 | 16.1609 | 2391.0 | 1840.9 | 1 | 163 | 0.000180509 | 1.0 | 0.624049 | 0.255313 | 4557.36 | 1004.29 | -9.17815 | 0.0884354 | 11.2 | 11.6051 | 1.81531 | 201.4 | 209.053 | 1 | 18 | 0.000180509 | 1.0 | 0.624049 | 0.023506 | 67.9 | 47.8497 | 169488 | 0.0284976 | -3.55794 | 
| 5 | 15 | 2007 | Audi | Foreign | A3シリーズ | 3874 | アトラクション | 2.93944 | GH-8PBSE | 12.2 | 5 | ハイオク | 51713048 | 10.8151 | 0.075 | 7.49134e-5 | 0.920174 | 0.312689 | 35.4 | 33.111 | 0.0357225 | 418.28 | 365.938 | 2.08997 | 225.1 | 232.358 | 0.230908 | 2583.73 | 2733.06 | 0.237689 | 23.2 | 22.2959 | 16.0534 | 2382.0 | 1839.16 | 2 | 162 | 0.00569413 | 1.04 | 0.639514 | 0.252811 | 4335.92 | 1039.11 | -9.41599 | 0.237689 | 23.2 | 22.2959 | 1.77728 | 189.7 | 199.247 | 2 | 17 | 0.00569413 | 1.04 | 0.639514 | 0.0242194 | 67.05 | 45.7941 | 162015 | 0.0239114 | -3.7334 | 
4.2 データクリーニング
data[!, :Foreign_d] = data[:, :Type] .== "Foreign";
data[!, :FuelRegular_d] = data[:, :FuelType] .== "レギュラー";
data[!, :capacity_d] = data[:, :capacity] .> 4;
transform!(
    data, 
    [
        :year => ByRow(isequal(v))=> Symbol("year_" * string(v)) 
        for v in unique(data.year)
        ]
    );
select!(data, Not(:year_2006));4.3 ランダム係数ロジットモデルの推定
sort!(data, [:year, :Maker, :price]);
N = nrow(data);
T = length(unique(data.year));
X1 = hcat(
    ones(N),
    Matrix(
        data[:,[
            :price, :FuelEfficiency, :hppw, :size, 
            :capacity_d, :FuelRegular_d, :Foreign_d
            ]]
        ),
    Matrix(data[:, r"^year_"])    
    );
X2 = Matrix(data[:, [:price]]);
Z = hcat(
    ones(N),
    Matrix(
        data[:, [
            :FuelEfficiency, :hppw, :size, 
            :capacity_d, :FuelRegular_d, :Foreign_d
            ]]
        ),
    Matrix(data[:, r"^year_"]),
    Matrix(data[:, r"^iv_GH.*(?<!nest)$"])
    );
Random.seed!(42);
Nsim = 1000;
randomDrawMat = randn(size(X2)[2], Nsim);marketIndex = data.year;
uniqueMarketIndex = sort(unique(data.year));
marketIndexMat = reduce(
    hcat, 
    [marketIndex .== market for market in uniqueMarketIndex]
    );
datalist = datalist_struct(
    X1, 
    X2, 
    Z, 
    data.share, 
    marketIndex, 
    data.logit_share, 
    randomDrawMat, 
    marketIndexMat
    );
parameter = parameter_struct(Nsim, T, N);initial_x = [0.7];
delta_ini = calculateMeanUtil(initial_x, datalist, datalist.logitshare);objFunc_for_Optim = OnceDifferentiable(
    x -> calculateGMMObjective(x, datalist, delta_ini),
    initial_x;
    autodiff = :forward
    );
@time resultGMM = optimize(
    objFunc_for_Optim,
    [0.0],
    [Inf],
    initial_x,
    Fminbox(),
    Optim.Options(show_trace = false)
)W = inv(datalist.Z' * datalist.Z);    
delta = calculateMeanUtil(resultGMM.minimizer, datalist, delta_ini);
beta_hat = (
    (datalist.X1' * datalist.Z * W * datalist.Z' * datalist.X1) \ 
    (datalist.X1' * datalist.Z * W * datalist.Z' * delta)
);Xi = delta - X1 * beta_hat;
Omega_hat = reduce(+, Z[i,:] * Z[i,:]' .* Xi[i]^2 ./ N for i = 1:N);
Ddelta = ForwardDiff.jacobian(
    x -> delta_ini = calculateMeanUtil(x, datalist, delta), 
    resultGMM.minimizer
    );
G = Z' * hcat(- X1, Ddelta) ./ N;
AsyVarMat = (G' * W * G) \ G' * W * Omega_hat * W * G * inv(G' * W * G);
Ase = sqrt.(diag(AsyVarMat) ./ N);
DataFrame(
    Var = [
        "Const", "Price", "Fuel Efficiency", "hppw", "size", 
        "capacity_d", "FuelRegular_d", "Foreign_d",
        "year_2007", "year_2008", "year_2009", 
        "year_2010", "year_2011", "year_2012", 
        "year_2013", "year_2014", "year_2015", "year_2016", 
        "random_price"
        ],
    Est = vcat(beta_hat, resultGMM.minimizer),
    se = Ase
)19×3 DataFrame
| Row | Var | Est | se | 
|---|---|---|---|
| String | Float64 | Float64 | |
| 1 | Const | -13.9027 | 0.568553 | 
| 2 | Price | -2.2782 | 0.660278 | 
| 3 | Fuel Efficiency | 0.196678 | 0.012633 | 
| 4 | hppw | 14.6705 | 3.61249 | 
| 5 | size | 0.55519 | 0.0766644 | 
| 6 | capacity_d | -0.323059 | 0.139002 | 
| 7 | FuelRegular_d | -1.13995 | 0.292049 | 
| 8 | Foreign_d | 1.04315 | 0.19486 | 
| 9 | year_2007 | -0.836153 | 0.176559 | 
| 10 | year_2008 | -0.704257 | 0.169228 | 
| 11 | year_2009 | -0.856319 | 0.169012 | 
| 12 | year_2010 | -0.0976351 | 0.152402 | 
| 13 | year_2011 | -0.254089 | 0.152604 | 
| 14 | year_2012 | -0.487342 | 0.16411 | 
| 15 | year_2013 | -0.625138 | 0.166785 | 
| 16 | year_2014 | -1.04974 | 0.180157 | 
| 17 | year_2015 | -1.15121 | 0.179025 | 
| 18 | year_2016 | -1.2502 | 0.180264 | 
| 19 | random_price | 0.70029 | 0.248176 | 
market2016Index = data.year .== 2016;
data_2016 = data[market2016Index, :];
@time elasmat_2016 = calculateElasticity(
    data_2016.price,
    X2[market2016Index, :],
    beta_hat,
    resultGMM.minimizer,
    randomDrawMat,
    delta[market2016Index]
);  0.270182 seconds (691.04 k allocations: 54.730 MiB, 86.41% compilation time)
4.4 限界費用の推定
Pricevec_2016 = data_2016.price;
Sharevec_2016 = data_2016.share;
Xi_2016 = Xi[data.year .== 2016];
Ownership_2016 = data_2016.Maker .== permutedims(data_2016.Maker);
Derivative_2016 = - elasmat_2016 .* Sharevec_2016' ./ Pricevec_2016;
Delta_2016 = Derivative_2016 .* Ownership_2016;
Marginal_Cost_2016 = Pricevec_2016 - (Delta_2016 \ Sharevec_2016);
pred_mc_df = DataFrame(
    Maker = data_2016.Maker, 
    Name = data_2016.Name, 
    Price = data_2016.price,
    MC = Marginal_Cost_2016,
    Margin = (data_2016.price .- Marginal_Cost_2016) ./ data_2016.price
);
first(pred_mc_df, 10)10×5 DataFrame
| Row | Maker | Name | Price | MC | Margin | 
|---|---|---|---|---|---|
| String15 | String31 | Float64 | Float64 | Float64 | |
| 1 | Audi | A3シリーズ | 3.28 | 2.41726 | 0.263031 | 
| 2 | Audi | A4シリーズ | 5.18 | 3.74093 | 0.277812 | 
| 3 | BMW | ミニ | 2.4 | 1.7001 | 0.291626 | 
| 4 | BMW | 1シリーズ | 3.1 | 2.27191 | 0.267127 | 
| 5 | BMW | X1 | 3.67 | 2.71345 | 0.26064 | 
| 6 | BMW | 2シリーズ | 3.81 | 2.81796 | 0.260378 | 
| 7 | BMW | 3シリーズ | 4.49 | 3.29924 | 0.265202 | 
| 8 | Daihatsu | ミラ | 0.885 | 0.379043 | 0.571703 | 
| 9 | Daihatsu | ムーヴ | 1.134 | 0.601233 | 0.469812 | 
| 10 | Daihatsu | ブーン | 1.15 | 0.615443 | 0.464832 | 
histogram(pred_mc_df.Margin, bins = 40, legend = false)4.5 合併シミュレーション
4.5.1 データの下準備
data_2016 = leftjoin(data_2016, pred_mc_df, on = ["Maker", "Name"]);
dropmissing!(data_2016);
data_2016[data_2016.Maker .== "Honda", :Maker] .= "Nippyo";
data_2016[data_2016.Maker .== "Nissan", :Maker] .= "BrandA";
data_2016[data_2016.Maker .== "Subaru", :Maker] .= "BrandB";
data_2016[data_2016.Maker .== "Toyota", :Maker] .= "BrandC";
data_2016[!, :MakerNippyoA] = data_2016[:, :Maker];
data_2016[!, :MakerNippyoB] = data_2016[:, :Maker];
data_2016[in(["Nippyo", "BrandA"]).(data_2016[:, :Maker]), :MakerNippyoA] .= "NippyoA";
data_2016[in(["Nippyo", "BrandB"]).(data_2016[:, :Maker]), :MakerNippyoB] .= "NippyoB";
Ownership_true = data_2016.Maker .== permutedims(data_2016.Maker);
Ownership_NippyoA = data_2016.MakerNippyoA .== permutedims(data_2016.MakerNippyoA);
Ownership_NippyoB = data_2016.MakerNippyoB .== permutedims(data_2016.MakerNippyoB);mc = data_2016.MC;
datalist_2016 = datalist_struct(
    X1[market2016Index, :],
    X2[market2016Index, :],
    Z[market2016Index, :],
    data_2016.share,
    data_2016.year,
    data_2016.logit_share,
    datalist.randomDrawMat,
    datalist.marketIndexMat[market2016Index, :]
);p_NippyoA = calculateEquilibriumPrice(
    datalist_2016,
    data_2016.price,
    Ownership_NippyoA,
    beta_hat,
    resultGMM.minimizer,
    mc,
    Xi_2016
);
p_NippyoB = calculateEquilibriumPrice(
    datalist_2016,
    data_2016.price,
    Ownership_NippyoB,
    beta_hat,
    resultGMM.minimizer,
    mc,
    Xi_2016
);4.5.2 合併シミュレーションによる価格・販売台数変化
merger_sim_df = DataFrame(
    Maker = data_2016.Maker, 
    Name = data_2016.Name, 
    Price_A = (p_NippyoA .- data_2016.price) ./ data_2016.price .* 100.0,
    Share_A = (simulateMarketShare(
                datalist_2016,
                p_NippyoA,
                beta_hat,
                resultGMM.minimizer,
                Xi_2016
            ) .- data_2016.share) ./ data_2016.share .* 100.0,
    Price_B = (p_NippyoB .- data_2016.price) ./ data_2016.price .* 100.0,
    Share_B = (simulateMarketShare(
                datalist_2016,
                p_NippyoB,
                beta_hat,
                resultGMM.minimizer,
                Xi_2016
            ) .- data_2016.share) ./ data_2016.share .* 100.0,
);
merger_sim_df[in(["Nippyo", "BrandA", "BrandB", "BrandC"]).(merger_sim_df.Maker), :]92×6 DataFrame
67 rows omitted
| Row | Maker | Name | Price_A | Share_A | Price_B | Share_B | 
|---|---|---|---|---|---|---|
| String15 | String31 | Float64 | Float64 | Float64 | Float64 | |
| 1 | Nippyo | N-WGN | 0.541509 | -1.13154 | 0.205652 | -0.43036 | 
| 2 | Nippyo | N-ONE | 0.53828 | -1.14005 | 0.204763 | -0.434345 | 
| 3 | Nippyo | N-BOX | 0.526869 | -1.17471 | 0.201748 | -0.450635 | 
| 4 | Nippyo | フィット | 0.523412 | -1.18701 | 0.200885 | -0.456444 | 
| 5 | Nippyo | バモス | 0.515992 | -1.21749 | 0.199145 | -0.4709 | 
| 6 | Nippyo | シャトル | 0.497664 | -1.35151 | 0.196526 | -0.5354 | 
| 7 | Nippyo | グレイス | 0.49624 | -1.37468 | 0.196691 | -0.546694 | 
| 8 | Nippyo | フリード | 0.49438 | -1.42958 | 0.197626 | -0.573601 | 
| 9 | Nippyo | ヴェゼル | 0.49419 | -1.44649 | 0.198051 | -0.581931 | 
| 10 | Nippyo | S660 | 0.494207 | -1.47187 | 0.198799 | -0.594463 | 
| 11 | Nippyo | ステップワゴン | 0.499161 | -1.60188 | 0.204403 | -0.659201 | 
| 12 | Nippyo | CR-V | 0.50524 | -1.67813 | 0.208852 | -0.697482 | 
| 13 | Nippyo | ジェイド | 0.507676 | -1.70312 | 0.210473 | -0.710059 | 
| ⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ | 
| 81 | BrandC | エスクァイア | 0.00519814 | 0.0500299 | 0.00233669 | 0.0204086 | 
| 82 | BrandC | ハイエースワゴン | 0.00518198 | 0.0504996 | 0.00232583 | 0.0206358 | 
| 83 | BrandC | ハリアー | 0.00514866 | 0.0513939 | 0.00230289 | 0.0210709 | 
| 84 | BrandC | アルファード | 0.0049542 | 0.0551905 | 0.00216216 | 0.0229581 | 
| 85 | BrandC | ヴェルファイア | 0.0049542 | 0.0551905 | 0.00216216 | 0.0229581 | 
| 86 | BrandC | カムリ | 0.00494805 | 0.0552835 | 0.00215763 | 0.0230052 | 
| 87 | BrandC | FJクルーザー | 0.00492789 | 0.0555804 | 0.00214276 | 0.0231559 | 
| 88 | BrandC | エスティマ | 0.00490764 | 0.0558671 | 0.00212779 | 0.0233018 | 
| 89 | BrandC | SAI | 0.00488527 | 0.0561714 | 0.00211125 | 0.0234572 | 
| 90 | BrandC | クラウン | 0.00441796 | 0.0607408 | 0.00176394 | 0.0258581 | 
| 91 | BrandC | ランドクルーザー | 0.00276548 | 0.0687654 | 0.000532712 | 0.0304729 | 
| 92 | BrandC | センチュリー | -0.00420307 | 0.0562356 | -0.0034201 | 0.0171902 | 
4.5.3 合併後に価格が変化しないような限界費用の計算
Ownership_2016_A = data_2016.MakerNippyoA .== permutedims(data_2016.MakerNippyoA);
Derivative_2016_A = - elasmat_2016 .* Sharevec_2016' ./ Pricevec_2016;
Delta_2016_A = Derivative_2016_A .* Ownership_2016_A;
mc_NippyoA_pfix = Pricevec_2016 - (Delta_2016_A \ Sharevec_2016);
Ownership_2016_B = data_2016.MakerNippyoB .== permutedims(data_2016.MakerNippyoB);
Derivative_2016_B = - elasmat_2016 .* Sharevec_2016' ./ Pricevec_2016;
Delta_2016_B = Derivative_2016_B .* Ownership_2016_B;
mc_NippyoB_pfix = Pricevec_2016 - (Delta_2016_B \ Sharevec_2016);
mc_sim_df = DataFrame(
    Maker = data_2016.Maker, 
    Name = data_2016.Name, 
    Nippyo_and_Brand_A = (mc_NippyoA_pfix .- mc) ./ mc .* 100.0,
    Nippyo_and_Brand_B = (mc_NippyoB_pfix .- mc) ./ mc .* 100.0,
);
mc_sim_df[in(["Nippyo", "BrandA", "BrandB", "BrandC"]).(mc_sim_df.Maker), :]92×4 DataFrame
67 rows omitted
| Row | Maker | Name | Nippyo_and_Brand_A | Nippyo_and_Brand_B | 
|---|---|---|---|---|
| String15 | String31 | Float64 | Float64 | |
| 1 | Nippyo | N-WGN | -0.91733 | -0.349287 | 
| 2 | Nippyo | N-ONE | -0.900594 | -0.343475 | 
| 3 | Nippyo | N-BOX | -0.842563 | -0.323451 | 
| 4 | Nippyo | フィット | -0.825194 | -0.317506 | 
| 5 | Nippyo | バモス | -0.787848 | -0.304822 | 
| 6 | Nippyo | シャトル | -0.685154 | -0.271214 | 
| 7 | Nippyo | グレイス | -0.673848 | -0.267729 | 
| 8 | Nippyo | フリード | -0.651828 | -0.261192 | 
| 9 | Nippyo | ヴェゼル | -0.646177 | -0.259586 | 
| 10 | Nippyo | S660 | -0.638542 | -0.257483 | 
| 11 | Nippyo | ステップワゴン | -0.611683 | -0.251122 | 
| 12 | Nippyo | CR-V | -0.60284 | -0.249869 | 
| 13 | Nippyo | ジェイド | -0.600761 | -0.249749 | 
| ⋮ | ⋮ | ⋮ | ⋮ | ⋮ | 
| 81 | BrandC | エスクァイア | 0.0 | 0.0 | 
| 82 | BrandC | ハイエースワゴン | 0.0 | 0.0 | 
| 83 | BrandC | ハリアー | 0.0 | 0.0 | 
| 84 | BrandC | アルファード | 0.0 | 0.0 | 
| 85 | BrandC | ヴェルファイア | 0.0 | 0.0 | 
| 86 | BrandC | カムリ | 0.0 | 0.0 | 
| 87 | BrandC | FJクルーザー | 0.0 | 0.0 | 
| 88 | BrandC | エスティマ | 0.0 | 0.0 | 
| 89 | BrandC | SAI | 0.0 | 0.0 | 
| 90 | BrandC | クラウン | 0.0 | 0.0 | 
| 91 | BrandC | ランドクルーザー | 0.0 | 0.0 | 
| 92 | BrandC | センチュリー | 0.0 | 0.0 | 
4.5.4 合併シミュレーションの厚生分析
CS_2016 = calculateCS(
    datalist_2016, 
    data_2016.price, 
    beta_hat, 
    resultGMM.minimizer, 
    Xi_2016,
    data_2016.HH[1]
);
CS_NippyoA = calculateCS(
    datalist_2016, 
    p_NippyoA, 
    beta_hat, 
    resultGMM.minimizer, 
    Xi_2016,
    data_2016.HH[1]
);
CS_NippyoB = calculateCS(
    datalist_2016, 
    p_NippyoB, 
    beta_hat, 
    resultGMM.minimizer, 
    Xi_2016,
    data_2016.HH[1]
);
CV_NippyoA = CS_NippyoA - CS_2016;
CV_NippyoB = CS_NippyoB - CS_2016;pro_rev_2016 = calculateProfit(
    data_2016.Maker,
    data_2016.price,
    mc,
    data_2016.share,
    data_2016.HH
);
pro_rev_NippyoA = calculateProfit(
    data_2016.Maker,
    p_NippyoA,
    mc,
    simulateMarketShare(
                datalist_2016,
                p_NippyoA,
                beta_hat,
                resultGMM.minimizer,
                Xi_2016,
            ),
    data_2016.HH
);
pro_rev_NippyoB = calculateProfit(
    data_2016.Maker,
    p_NippyoB,
    mc,
    simulateMarketShare(
                datalist_2016,
                p_NippyoB,
                beta_hat,
                resultGMM.minimizer,
                Xi_2016,
            ),
    data_2016.HH
);
TS_change_NippyoA = CV_NippyoA + sum(pro_rev_NippyoA.profit - pro_rev_2016.profit);
TS_change_NippyoB = CV_NippyoB + sum(pro_rev_NippyoB.profit - pro_rev_2016.profit);DataFrame(
    Measure = ["Consumer surplus", "Total welfare"],
    Nippyo_and_Brand_A = [CV_NippyoA, TS_change_NippyoA],
    Nippyo_and_Brand_B = [CV_NippyoB, TS_change_NippyoB],
)2×3 DataFrame
| Row | Measure | Nippyo_and_Brand_A | Nippyo_and_Brand_B | 
|---|---|---|---|
| String | Float64 | Float64 | |
| 1 | Consumer surplus | -11740.6 | -4610.7 | 
| 2 | Total welfare | -10457.5 | -4060.65 | 
result_df = DataFrame(
    Maker = pro_rev_2016.Maker,
    Profits_NippyoA = pro_rev_NippyoA.profit - pro_rev_2016.profit,
    Revenue_NippyoA = pro_rev_NippyoA.revenue - pro_rev_2016.revenue,
    Profits_NippyoB = pro_rev_NippyoB.profit - pro_rev_2016.profit,
    Revenue_NippyoB = pro_rev_NippyoB.revenue - pro_rev_2016.revenue,
);
total_df = combine(result_df, 2:5 .=> sum .=> names(result_df)[2:5]);
total_df[!, :Maker] .= "Total"
append!(result_df, total_df)16×5 DataFrame
| Row | Maker | Profits_NippyoA | Revenue_NippyoA | Profits_NippyoB | Revenue_NippyoB | 
|---|---|---|---|---|---|
| String15 | Float64 | Float64 | Float64 | Float64 | |
| 1 | Audi | 11.7143 | 43.2563 | 4.81051 | 18.5928 | 
| 2 | BMW | 39.1788 | 134.846 | 16.3626 | 56.9962 | 
| 3 | Daihatsu | 115.249 | 224.046 | 46.3959 | 88.9923 | 
| 4 | Fiat | 1.6232 | 4.50466 | 0.67127 | 1.83475 | 
| 5 | Lexas | 65.7824 | 239.717 | 24.6482 | 108.337 | 
| 6 | Matsuda | 63.1001 | 164.767 | 25.9724 | 67.0548 | 
| 7 | Mercedes | 57.4933 | 211.167 | 21.5483 | 95.6349 | 
| 8 | Mitsubishi | 21.7094 | 54.6053 | 8.9026 | 22.1991 | 
| 9 | Suzuki | 120.615 | 231.995 | 48.5311 | 92.1837 | 
| 10 | Volkswagen | 20.6055 | 64.2728 | 8.60925 | 26.6126 | 
| 11 | Volvo | 9.62959 | 35.0214 | 4.01389 | 14.9299 | 
| 12 | Nippyo | 83.8031 | -9633.81 | 44.2023 | -3841.84 | 
| 13 | BrandA | 14.4172 | -10950.4 | 59.5346 | 154.201 | 
| 14 | BrandB | 58.2013 | 166.716 | -12.6581 | -5066.24 | 
| 15 | BrandC | 599.97 | 1536.03 | 248.508 | 629.8 | 
| 16 | Total | 1283.09 | -17473.3 | 550.053 | -7530.71 | 
4.6 追加的なシミュレーション
costReducingFirms = ["Nippyo", "Brand_A"];
distance = 100
lambda = 1e-6;
max_cost_red = 1.0;
min_cost_red = 0.0;
iter = 1;@time while (distance > lambda) & (iter < 100)
    
    mid_cost_red = (max_cost_red + min_cost_red) / 2.0;
    
    mid_eval = calculateTSChangeByCostReduction(
        mid_cost_red,
        costReducingFirms,
        Ownership_NippyoA,
        data_2016,
        mc,
        datalist_2016,
        beta_hat,
        resultGMM.minimizer,
        data_2016.HH,
        p_NippyoA,
        pro_rev_2016,
        CS_2016,
        Xi_2016
    );
    
    if mid_eval > 0
        min_cost_red = mid_cost_red;
    else
        max_cost_red = mid_cost_red;
    end
    
    distance = abs(mid_eval - 0);
    iter += 1
    
end
cost_red_NippyoA = (min_cost_red + min_cost_red) / 2.0;mc_NippyoA_TSfix = mc[:];
mc_NippyoA_TSfix[in(costReducingFirms).(data_2016.Maker)] .*= cost_red_NippyoA;p_NippyoA_TSfix = calculateEquilibriumPrice(
    datalist_2016, 
    p_NippyoA, 
    Ownership_NippyoA, 
    beta_hat, 
    resultGMM.minimizer, 
    mc_NippyoA_TSfix, 
    Xi_2016
    );
share_NippyoA_TSfix = simulateMarketShare(
    datalist_2016, 
    p_NippyoA_TSfix, 
    beta_hat, 
    resultGMM.minimizer, 
    Xi_2016
    );costReducingFirms = ["Nippyo", "Brand_B"];
distance = 100
lambda = 1e-6;
max_cost_red = 1.0;
min_cost_red = 0.0;
iter = 1;@time while (distance > lambda) & (iter < 100)
    
    mid_cost_red = (max_cost_red + min_cost_red) / 2.0;
    
    mid_eval = calculateTSChangeByCostReduction(
        mid_cost_red,
        costReducingFirms,
        Ownership_NippyoB,
        data_2016,
        mc,
        datalist_2016,
        beta_hat,
        resultGMM.minimizer,
        data_2016.HH,
        p_NippyoB,
        pro_rev_2016,
        CS_2016,
        Xi_2016
    );
    
    if mid_eval > 0
        min_cost_red = mid_cost_red;
    else
        max_cost_red = mid_cost_red;
    end
    
    distance = abs(mid_eval - 0);
    iter += 1
    
end
cost_red_NippyoB = (min_cost_red + min_cost_red) / 2.0;mc_NippyoB_TSfix = mc[:];
mc_NippyoB_TSfix[in(costReducingFirms).(data_2016.Maker)] .*= cost_red_NippyoB;p_NippyoB_TSfix = calculateEquilibriumPrice(
    datalist_2016, 
    p_NippyoB, 
    Ownership_NippyoB,
    beta_hat, 
    resultGMM.minimizer, 
    mc_NippyoB_TSfix, 
    Xi_2016
    );
share_NippyoB_TSfix = simulateMarketShare(
    datalist_2016, 
    p_NippyoB_TSfix, 
    beta_hat, 
    resultGMM.minimizer, 
    Xi_2016
    );[1-cost_red_NippyoA 1-cost_red_NippyoB] .* 1001×2 Matrix{Float64}:
 1.46299  0.566009
4.6.1 限界費用削減をしたときの利潤と収入の変化
pro_rev_NippyoA_rc = calculateProfit(
    data_2016.Maker,
    p_NippyoA_TSfix,
    mc_NippyoA_TSfix,
    share_NippyoA_TSfix,
    data_2016.HH
);
pro_rev_NippyoB_rc = calculateProfit(
    data_2016.Maker,
    p_NippyoB_TSfix,
    mc_NippyoB_TSfix,
    share_NippyoB_TSfix,
    data_2016.HH
);
result2_df = DataFrame(
    Maker = pro_rev_2016.Maker,
    Profits_NippyoA = pro_rev_NippyoA_rc.profit - pro_rev_2016.profit,
    Revenue_NippyoA = pro_rev_NippyoA_rc.revenue - pro_rev_2016.revenue,
    Profits_NippyoB = pro_rev_NippyoB_rc.profit - pro_rev_2016.profit,
    Revenue_NippyoB = pro_rev_NippyoB_rc.revenue - pro_rev_2016.revenue,
);
total2_df = combine(result2_df, 2:5 .=> sum .=> names(result2_df)[2:5]);
total2_df[!, :Maker] .= "Total";
append!(result2_df, total2_df)16×5 DataFrame
| Row | Maker | Profits_NippyoA | Revenue_NippyoA | Profits_NippyoB | Revenue_NippyoB | 
|---|---|---|---|---|---|
| String15 | Float64 | Float64 | Float64 | Float64 | |
| 1 | Audi | 0.793296 | 0.201725 | 0.582527 | 1.91046 | 
| 2 | BMW | 1.30464 | -0.281661 | 1.69209 | 4.62644 | 
| 3 | Daihatsu | -2.32447 | -5.48557 | 0.798129 | -0.0426312 | 
| 4 | Fiat | -0.0129613 | -0.082301 | 0.0369978 | 0.0560639 | 
| 5 | Lexas | 10.4044 | -3.42116 | 3.23798 | 14.1655 | 
| 6 | Matsuda | -0.530124 | -2.95159 | 1.30437 | 2.0182 | 
| 7 | Mercedes | 8.89116 | -3.77824 | 2.75485 | 12.3406 | 
| 8 | Mitsubishi | -0.208908 | -0.982314 | 0.404897 | 0.643476 | 
| 9 | Suzuki | -2.43621 | -5.65451 | 0.808416 | 0.000309139 | 
| 10 | Volkswagen | 0.103842 | -0.763724 | 0.664013 | 1.39932 | 
| 11 | Volvo | 0.462478 | 0.0981585 | 0.463932 | 1.3971 | 
| 12 | Nippyo | 10318.3 | 11771.1 | 3965.29 | 4405.35 | 
| 13 | BrandA | -134.893 | -11555.4 | 3.09464 | 5.4871 | 
| 14 | BrandB | -0.0324358 | -2.34412 | -35.68 | -5169.25 | 
| 15 | BrandC | 1.32803 | -25.8976 | 16.4805 | 24.1591 | 
| 16 | Total | 10201.1 | 164.387 | 3961.93 | -695.748 | 
@printf(
    "Percent change in profit by Brand A merger: %.3f \n", 
    (sum(pro_rev_NippyoA_rc.profit) - sum(pro_rev_2016.profit)) / sum(pro_rev_2016.profit) * 100.0
    )
@printf(
    "Percent change in revenue by brand A merger: %.3f \n", 
    (sum(pro_rev_NippyoA_rc.revenue) - sum(pro_rev_2016.revenue)) / sum(pro_rev_2016.revenue) * 100.0
    )
@printf(
    "Percent change in profit by Brand B merger: %.3f \n", 
    (sum(pro_rev_NippyoB_rc.profit) - sum(pro_rev_2016.profit)) / sum(pro_rev_2016.profit) * 100.0
    )
@printf(
    "Percent change in revenue by Brand B merger: %.3f \n", 
    (sum(pro_rev_NippyoB_rc.revenue) - sum(pro_rev_2016.revenue)) / sum(pro_rev_2016.revenue) * 100.0
    )Percent change in profit by Brand A merger: 0.384 
Percent change in revenue by brand A merger: 0.002 
Percent change in profit by Brand B merger: 0.149 
Percent change in revenue by Brand B merger: -0.009