11  推定 2

using DataFrames
using Random
using Distributions
using JLD2
using Statistics
using StatsBase
using LinearAlgebra
using Optim
mutable struct global_param_struct
    beta::Float64
    eulergamma::Float64
    entryMat::Matrix{Int}
    numFirmsVec::Vector{Int}
    economyVec::Vector{Int}
    possibleActionArray::Array{Int, 3}
end
for file in readdir("functions/dynamic_game/")
    include("functions/dynamic_game/" * file)
end

11.1 パラメタの設定

TransitionMat = [0.7 0.3; 0.4 0.6]

Random.seed!(123);
Parameters = [
    0.3,
    0.2,
    -0.27,
    0.45,
    -0.15,
    -2.10
];

parameterMat = hcat([
    [Parameters[i]; Parameters[3:6]]
    for i in 1:2
]...);
NumSimPeriods = 100;
NumSimFirms = 2;
NumSimulations = 1000;
NumSimMarkets = 8;

NumSimMarketsInData = 500;

numBootSample = 100;

11.2 前章で生成したデータと推定したパラメタの読み込み

@load "tmp/dynamic_game/data_workspace.jld2";
@load "tmp/dynamic_game/estimates_1.jld2";
InitialState = hcat(1:8, 1:8);;
EVrandom = reshape(
    -log.(-log.(rand(NumSimMarkets * NumSimPeriods * NumSimFirms * NumSimulations * 8 * 3))),
    (NumSimMarkets, NumSimPeriods, NumSimFirms, NumSimulations, 8, 3)
);

UNIrandom = reshape(
    rand(NumSimMarkets * NumSimPeriods * NumSimulations),
    (NumSimMarkets, NumSimPeriods, NumSimulations)
);
@time Wstar = VSigmaGeneration(
    CCP1Mat[:, 2],
    CCP2Mat[:, 2],
    TransitionMat,
    EVrandom,
    UNIrandom,
    InitialState,
    NumSimMarkets,
    NumSimulations,
    NumSimPeriods,
    global_param
);

W1star = Wstar[1];
W2star = Wstar[2];
  1.297144 seconds (6.04 M allocations: 569.625 MiB, 9.94% gc time, 59.58% compilation time)
param1 = [parameterMat[:, 1]; 1];
param2 = [parameterMat[:, 2]; 1];
DataFrame(
    "True value" => exanteV1,
    "Simulated value" => W1star' * param1,
    "Difference" => exanteV1 - W1star' * param1
)
8×3 DataFrame
RowTrue valueSimulated valueDifference
Float64Float64Float64
14.65684.537180.119622
24.587324.63857-0.0512471
36.568766.521980.0467797
46.158876.18534-0.0264716
54.612384.608420.00396147
64.546174.58591-0.0397407
76.015815.874330.141481
85.60885.69862-0.0898211
DataFrame(
    "True value" => exanteV2,
    "Simulated value" => W2star' * param2,
    "Difference" => exanteV2 - W2star' * param2
)
8×3 DataFrame
RowTrue valueSimulated valueDifference
Float64Float64Float64
14.441194.48669-0.0454969
26.178926.146460.0324623
34.380044.47488-0.0948405
45.776455.80853-0.03208
54.401394.47127-0.0698898
65.629995.540350.0896341
74.342854.40536-0.0625095
85.229725.208720.0209918
Normalized_TrueParam = [
    Parameters[1] - ((1 - global_param.beta) / global_param.beta) * Parameters[5],
    Parameters[3],
    Parameters[4],
    0,
    Parameters[6] + Parameters[5],
    Parameters[2] - ((1 - global_param.beta) / global_param.beta) * Parameters[5],
    Parameters[3],
    Parameters[4],
    0,
    Parameters[6] + Parameters[5],
];

normparam1 = [Normalized_TrueParam[1:5]; 1];
normparam2 = [Normalized_TrueParam[6:10]; 1];
DataFrame(
    "True value" => exanteV1,
    "Simulated value (original param)" => W1star' * param1,
    "Simulated value (normalized param)" => W1star' * normparam1
)
8×3 DataFrame
RowTrue valueSimulated value (original param)Simulated value (normalized param)
Float64Float64Float64
14.65684.537184.53718
24.587324.638574.63857
36.568766.521986.70948
46.158876.185346.37284
54.612384.608424.60842
64.546174.585914.58591
76.015815.874336.06183
85.60885.698625.88612
DataFrame(
    "True value" => exanteV2,
    "Simulated value (original param)" => W2star' * param2,
    "Simulated value (normalized param)" => W2star' * normparam2
)
8×3 DataFrame
RowTrue valueSimulated value (original param)Simulated value (normalized param)
Float64Float64Float64
14.441194.486694.48669
26.178926.146466.33396
34.380044.474884.47488
45.776455.808535.99603
54.401394.471274.47127
65.629995.540355.72785
74.342854.405364.40536
85.229725.208725.39622
println("Difference b/w two simulated values (with and without normalization)")
DataFrame(
    "Firm 1" => W1star' * param1 - W1star' * normparam1,
    "Firm 2" => W2star' * param2 - W2star' * normparam2,
)
Difference b/w two simulated values (with and without normalization)
8×2 DataFrame
RowFirm 1Firm 2
Float64Float64
12.15419e-111.96705e-11
22.2764e-11-0.1875
3-0.18752.10454e-11
4-0.1875-0.1875
52.31068e-111.90594e-11
62.28786e-11-0.1875
7-0.18752.11973e-11
8-0.1875-0.1875

11.3 Forward simulationを用いたPesendorfer and Schmidt-Denglerによるパラメタの推定

@time Wstar = VSigmaGeneration(
    EstimatedCCP1Mat[:, 2],
    EstimatedCCP2Mat[:, 2],
    EstimatedTransition,
    EVrandom,
    UNIrandom,
    InitialState,
    NumSimMarkets,
    NumSimulations,
    NumSimPeriods,
    global_param
);

W1star = Wstar[1];
W2star = Wstar[2];
  0.278932 seconds (4.80 M allocations: 489.018 MiB, 19.05% gc time)
initial = [0.3375, 0.2375, -0.27, 0.45, -2.25];

@time resultForwardPSD = optimize(
    x -> Estimation_forward_PSD(
        x,
        W1star,
        W2star,
        EstimatedTransition,
        EstimatedCCP1Mat,
        EstimatedCCP2Mat,
        global_param
    ),
    initial,
    Optim.Options(show_trace = false)
)
bootindex = reshape(
    sample(1:NumSimMarketsInData, NumSimMarketsInData * numBootSample),
    (NumSimMarketsInData, numBootSample)
);

bootresult_transition = zeros(2, numBootSample);
bootresult_CCP1 = zeros(8, numBootSample);
bootresult_CCP2 = zeros(8, numBootSample);
bootresult_payoff = zeros(5, numBootSample);
@time for b in 1:numBootSample

    bootsample = vcat(
        [FakeData[FakeData[:, 1] .== bootindex[m, b], :] for m in 1:NumSimMarketsInData]...
        );

    output = Bootstrap_PS_forward(
        bootsample, 
        global_param,
        EVrandom,
        UNIrandom,
        InitialState,
        NumSimMarkets,
        NumSimulations,
        NumSimPeriods
        );

    bootresult_payoff[:, b] = output[1].minimizer;
    bootresult_CCP1[:, b] = output[2][:, 2]
    bootresult_CCP2[:, b] = output[3][:, 2]
    bootresult_transition[:, b] = diag(output[4]);

end
DataFrame(
    "True param" => [Parameters[1:4]; Parameters[6]],
    "True param (normalized)" => Normalized_TrueParam[[1, 6, 2, 3, 5]],
    "Estimates" => resultForwardPSD.minimizer,
    "SE" => vec(std(bootresult_payoff, dims = 2))
)
5×4 DataFrame
RowTrue paramTrue param (normalized)EstimatesSE
Float64Float64Float64Float64
10.30.33750.3948520.0544667
20.20.23750.3191430.0561027
3-0.27-0.27-0.3195760.0373488
40.450.450.4405780.0926289
5-2.1-2.25-2.223640.0186967

11.4 BBLの不等式推定量を用いたパラメタの推定

NumPerturbations = 200;

PerturbedCCP1 = reshape(
    clamp.(
        repeat(EstimatedCCP1Mat[:, 2], NumPerturbations) + 
        rand(Normal(0, .1), 8 * NumPerturbations),
        0.001, 0.999
    ),
    (8, NumPerturbations)
);

PerturbedCCP2 = reshape(
    clamp.(
        repeat(EstimatedCCP2Mat[:, 2], NumPerturbations) + 
        rand(Normal(0, .1), 8 * NumPerturbations),
        0.001, 0.999
    ),
    (8, NumPerturbations)
);
W1_all = zeros(6, NumSimMarkets, NumPerturbations);
W2_all = zeros(6, NumSimMarkets, NumPerturbations);
@time for per in 1:NumPerturbations

    W1_p = VSigmaGeneration(
        PerturbedCCP1[:, per],
        EstimatedCCP2Mat[:, 2],
        EstimatedTransition,
        EVrandom,
        UNIrandom,
        InitialState,
        NumSimMarkets,
        NumSimulations,
        NumSimPeriods,
        global_param
    );
    W1_all[:, :, per] = W1_p[1];

    W2_p = VSigmaGeneration(
        EstimatedCCP1Mat[:, 2],
        PerturbedCCP2[:, per],
        EstimatedTransition,
        EVrandom,
        UNIrandom,
        InitialState,
        NumSimMarkets,
        NumSimulations,
        NumSimPeriods,
        global_param
    );
    W2_all[:, :, per] = W2_p[2];

end
@time BBLobjective(
        initial,
        NumPerturbations,
        W1star,
        W2star,
        W1_all,
        W2_all
    )
initial = [0.3, 0.2, -0.27, 0.45, -2.1];

@time resultBBL = optimize(
    x -> BBLobjective(
        x,
        NumPerturbations,
        W1star,
        W2star,
        W1_all,
        W2_all
    ),
    initial,
    Optim.Options(show_trace = false)
)
bootindex = reshape(
    sample(1:NumSimMarketsInData, NumSimMarketsInData * numBootSample),
    (NumSimMarketsInData, numBootSample)
);

bootresult_transition_BBL = zeros(2, numBootSample);
bootresult_CCP1_BBL = zeros(8, numBootSample);
bootresult_CCP2_BBL = zeros(8, numBootSample);
bootresult_payoff_BBL = zeros(5, numBootSample);
@time for b in 1:numBootSample

    bootsample = vcat(
        [FakeData[FakeData[:, 1] .== bootindex[m, b], :] for m in 1:NumSimMarketsInData]...
        );

    output = Bootstrap_BBL(
        bootsample, 
        global_param,
        EVrandom,
        UNIrandom,
        InitialState,
        NumSimMarkets,
        NumSimulations,
        NumSimPeriods,
        NumPerturbations
        );

    bootresult_payoff_BBL[:, b] = output[1].minimizer;
    bootresult_CCP1_BBL[:, b] = output[2][:, 2]
    bootresult_CCP2_BBL[:, b] = output[3][:, 2]
    bootresult_transition_BBL[:, b] = diag(output[4]);

end
DataFrame(
    "True param" => [Parameters[1:4]; Parameters[6]],
    "True param (normalized)" => Normalized_TrueParam[[1, 6, 2, 3, 5]],
    "Estimates" => resultBBL.minimizer,
    "SE" => vec(std(bootresult_payoff_BBL, dims = 2))
)
5×4 DataFrame
RowTrue paramTrue param (normalized)EstimatesSE
Float64Float64Float64Float64
10.30.33750.3613640.156315
20.20.23750.1701430.167567
3-0.27-0.27-0.2928710.151854
40.450.450.5253810.262609
5-2.1-2.25-2.100090.0884199
DataFrame(
    "True param" => [Parameters[1:4]; Parameters[6]],
    "True param (normalized)" => Normalized_TrueParam[[1, 6, 2, 3, 5]],
    "Estimates (Forward P-SD)" => resultForwardPSD.minimizer,
    "SE (Forward P-SD)" => vec(std(bootresult_payoff, dims = 2)),
    "Estimates (BBL)" => resultBBL.minimizer,
    "SE (BBL)" => vec(std(bootresult_payoff_BBL, dims = 2))
)
5×6 DataFrame
RowTrue paramTrue param (normalized)Estimates (Forward P-SD)SE (Forward P-SD)Estimates (BBL)SE (BBL)
Float64Float64Float64Float64Float64Float64
10.30.33750.3948520.05446670.3613640.156315
20.20.23750.3191430.05610270.1701430.167567
3-0.27-0.27-0.3195760.0373488-0.2928710.151854
40.450.450.4405780.09262890.5253810.262609
5-2.1-2.25-2.223640.0186967-2.100090.0884199