diff --git a/DialogTools/RegressionReportDlg.cpp b/DialogTools/RegressionReportDlg.cpp index 3e2da59f1..45b21e2e0 100644 --- a/DialogTools/RegressionReportDlg.cpp +++ b/DialogTools/RegressionReportDlg.cpp @@ -88,6 +88,16 @@ void RegressionReportDlg::CreateControls() vbox->Add(m_textbox, 1, wxEXPAND|wxALL|wxALIGN_CENTRE); panel->SetSizer(vbox); + + + //wxBitmap edit = wxArtProvider::GetBitmap(wxART_PRINT); + //wxBitmap save = wxArtProvider::GetBitmap(wxART_FILE_SAVE); + //wxToolBar *toolbar = CreateToolBar(); + //toolbar->AddTool(wxID_EDIT, "Change Font", edit); + //toolbar->AddTool(wxID_SAVE, "Save Regression Results", save); + //toolbar->Realize(); + //Connect(wxID_EDIT, wxEVT_COMMAND_TOOL_CLICKED, wxCommandEventHandler(RegressionReportDlg::OnFontChanged)); + //Connect(wxID_SAVE, wxEVT_COMMAND_TOOL_CLICKED, wxCommandEventHandler(RegressionReportDlg::OnFontChanged)); Center(); } @@ -105,7 +115,7 @@ void RegressionReportDlg::SetReport(const wxString report) void RegressionReportDlg::OnMouseEvent(wxMouseEvent& event) { - if (event.RightUp()) + if (event.RightDown()) PopupMenu(wxXmlResource::Get()-> LoadMenu("ID_REPORT_VIEW_MENU_CONTEXT"), event.GetPosition().x, event.GetPosition().y); @@ -114,7 +124,7 @@ void RegressionReportDlg::OnMouseEvent(wxMouseEvent& event) void RegressionReportDlg::OnFontChanged(wxCommandEvent& event) { wxFontData data; - wxFontDialog dlg(this, data); + wxFontDialog dlg(NULL, data); wxTextAttr attr; if (dlg.ShowModal() == wxID_OK) diff --git a/Explore/LineChartView.cpp b/Explore/LineChartView.cpp index 2df3e6610..5aacf4755 100644 --- a/Explore/LineChartView.cpp +++ b/Explore/LineChartView.cpp @@ -167,9 +167,14 @@ has_excluded(1) wxButton* btn_save_dummy = new wxButton(lpanel, wxID_ANY, "Save Dummy"); wxButton* btn_apply = new wxButton(lpanel, wxID_ANY, "Run Diff-in-Diff Test"); wxBoxSizer* btn_box = new wxBoxSizer(wxHORIZONTAL); - btn_box->Add(btn_save_dummy, 1, wxALIGN_CENTER |wxEXPAND| wxALL, 10); btn_box->Add(btn_apply, 1, wxALIGN_CENTER | wxEXPAND | wxALL, 10); - + btn_box->Add(btn_save_dummy, 1, wxALIGN_CENTER |wxEXPAND| wxALL, 10); + + chk_save_did = new wxCheckBox(lpanel, wxID_ANY, "Save Test Results"); + wxBoxSizer* chk_box = new wxBoxSizer(wxHORIZONTAL); + chk_box->Add(chk_save_did, 1, wxALIGN_LEFT |wxLEFT, 10); + + wxHtmlWindow* wv = 0; wv = new wxHtmlWindow(lpanel, wxID_ANY, wxDefaultPosition, wxSize(230, 100)); stats_wins.push_back(wv); @@ -182,6 +187,7 @@ has_excluded(1) rbox->Add(tests_sizer, 0, wxALIGN_TOP | wxALL, 20); //rbox->Add(chk_run_test, 0, wxALIGN_TOP | wxLEFT | wxRIGHT | wxBOTTOM, 20); rbox->Add(btn_box, 0, wxALIGN_TOP | wxEXPAND | wxLEFT | wxRIGHT | wxTOP, 10); + rbox->Add(chk_box, 0, wxALIGN_TOP | wxEXPAND | wxLEFT | wxRIGHT , 10); rbox->Add(stats_box, 1, wxALIGN_TOP | wxEXPAND | wxALL, 10); lpanel->SetSizerAndFit(rbox); @@ -803,14 +809,16 @@ void LineChartFrame::OnAdjustYAxisPrecision(wxCommandEvent& event) Refresh(); } -void LineChartFrame::OnSaveDummyTable(wxCommandEvent& event) +void LineChartFrame::SaveDataAndResults(bool save_weights, bool save_did, + double* m_yhat1, double* m_resid1) { - LOG_MSG("Start LineChartFrame::OnSaveDummyTable"); int nTests = var_man.GetVarsCount(); + nTests = 1; // only handle one variable at a time + TableInterface* table_int = project->GetTableInt(); const std::vector& hs(highlight_state->GetHighlight()); int n_obs = project->GetNumRecords(); - + std::vector tm_strs; table_int->GetTimeStrings(tm_strs); @@ -827,13 +835,13 @@ void LineChartFrame::OnSaveDummyTable(wxCommandEvent& event) std::vector id_stack; std::vector newids; std::vector period_stack; - + var_stack_array.resize(nTests); for (int i=0; iGetSelection(); wxString col_name = variable_names[variable_selection]; - + TableInterface* table_int = project->GetTableInt(); int col = table_int->FindColId(col_name); @@ -864,8 +872,8 @@ void LineChartFrame::OnSaveDummyTable(wxCommandEvent& event) } } else { - - for (size_t t=0; tGetSelection() == 0 ? true : false; - + int idx = 0; for (int t=0; tUpdateData(newids); @@ -1005,7 +1014,7 @@ void LineChartFrame::OnSaveDummyTable(wxCommandEvent& event) } if (!id_stack.empty()) { - int n = id_stack.size(); + n = id_stack.size(); if (mem_table_int == NULL) mem_table_int = new OGRTable(n); bool using_default_id = true; @@ -1022,7 +1031,7 @@ void LineChartFrame::OnSaveDummyTable(wxCommandEvent& event) int c_id = table_int->FindColId(gw->id_field); if (c_id > 0) { table_int->GetColData(c_id, 1, id_vec); - + vector new_id_vec; for (int ii=0; iiUpdateData(period_stack); mem_table_int->AddOGRColumn(period_col); } + if (!var_stack_array.empty()) { + for (size_t i=0; iFindColId(col_name); + GdaConst::FieldType f_type = table_int->GetColType(col_idx, 0); + OGRColumn* var_col; + if (f_type == GdaConst::long64_type) + var_col = new OGRColumnInteger(col_name, 18, 0, n); + else + var_col = new OGRColumnDouble(col_name, 18, 9, n); + var_col->UpdateData(var_stack_array[i]); + mem_table_int->AddOGRColumn(var_col); + } + } + if (!dummy_time_stack.empty()) { - int n = dummy_time_stack.size(); + n = dummy_time_stack.size(); if (mem_table_int == NULL) mem_table_int = new OGRTable(n); OGRColumn* time_col = new OGRColumnInteger("TIME", 18, 0, n); time_col->UpdateData(dummy_time_stack); @@ -1053,66 +1079,78 @@ void LineChartFrame::OnSaveDummyTable(wxCommandEvent& event) } if (!dummy_select_stack.empty()) { - int n = dummy_select_stack.size(); + n = dummy_select_stack.size(); if (mem_table_int == NULL) mem_table_int = new OGRTable(n); OGRColumn* select_col = new OGRColumnInteger("SPACE", 18, 0, n); select_col->UpdateData(dummy_select_stack); mem_table_int->AddOGRColumn(select_col); } - + if (!interaction_stack.empty()) { - int n = interaction_stack.size(); + n = interaction_stack.size(); if (mem_table_int == NULL) mem_table_int = new OGRTable(n); OGRColumn* interact_col = new OGRColumnInteger("INTERACT", 18, 0, n); interact_col->UpdateData(interaction_stack); mem_table_int->AddOGRColumn(interact_col); } + - if (!var_stack_array.empty()) { - for (size_t i=0; i yhat; + std::vector resid; + for (int m=0; mFindColId(col_name); - GdaConst::FieldType f_type = table_int->GetColType(col_idx, 0); - OGRColumn* var_col; - if (f_type == GdaConst::long64_type) - var_col = new OGRColumnInteger(col_name, 18, 0, n); - else - var_col = new OGRColumnDouble(col_name, 18, 9, n); - var_col->UpdateData(var_stack_array[i]); - mem_table_int->AddOGRColumn(var_col); + OGRColumn* pred_col = new OGRColumnDouble("OLS_PREDIC", 18, 9, n); + pred_col->UpdateData(yhat); + mem_table_int->AddOGRColumn(pred_col); + OGRColumn* resi_col = new OGRColumnDouble("OLS_RESIDU", 18, 9, n); + resi_col->UpdateData(resid); + mem_table_int->AddOGRColumn(resi_col); + } } // export ExportDataDlg dlg(this, (TableInterface*)mem_table_int); if (dlg.ShowModal() == wxID_OK) { - wxString ds_name = dlg.GetDatasourceName(); - wxFileName wx_fn(ds_name); - - // save weights - // Get default GalWeight* - // change to space-time weights - WeightsManInterface* wmi = NULL; - if (project && project->GetWManInt()) { - wmi = project->GetWManInt(); - boost::uuids::uuid default_wid = wmi->GetDefault(); - if (!default_wid.is_nil()) { - GeoDaWeight* w = wmi->GetWeights(default_wid); - if (w->weight_type == GeoDaWeight::gal_type) { - wx_fn.SetExt("gal"); - } else if (w->weight_type == GeoDaWeight::gwt_type) { - wx_fn.SetExt("gwt"); + if (save_weights) { + wxString ds_name = dlg.GetDatasourceName(); + wxFileName wx_fn(ds_name); + + // save weights + // Get default GalWeight* + // change to space-time weights + WeightsManInterface* wmi = NULL; + if (project && project->GetWManInt()) { + wmi = project->GetWManInt(); + boost::uuids::uuid default_wid = wmi->GetDefault(); + if (!default_wid.is_nil()) { + GeoDaWeight* w = wmi->GetWeights(default_wid); + if (w->weight_type == GeoDaWeight::gal_type) { + wx_fn.SetExt("gal"); + } else if (w->weight_type == GeoDaWeight::gwt_type) { + wx_fn.SetExt("gwt"); + } + wxString ofn(wx_fn.GetFullPath()); + w->SaveDIDWeights(project, n_obs, newids, id_stack, ofn); } - wxString ofn(wx_fn.GetFullPath()); - w->SaveDIDWeights(project, n_obs, newids, id_stack, ofn); } } } // clean memory delete mem_table_int; + +} +void LineChartFrame::OnSaveDummyTable(wxCommandEvent& event) +{ + LOG_MSG("Start LineChartFrame::OnSaveDummyTable"); + bool save_w = true; + SaveDataAndResults(save_w); LOG_MSG("End LineChartFrame::OnSaveDummyTable"); } @@ -1181,10 +1219,11 @@ void LineChartFrame::RunDIDTest() int nX = 0; double* y; double **x; + DiagnosticReport* m_DR; if (compare_regimes) { - m_Xnames.push_back("SPACE_DUMMY"); + m_Xnames.push_back("SPACE"); nX = m_Xnames.size(); int n = m_obs; @@ -1218,29 +1257,27 @@ void LineChartFrame::RunDIDTest() } } - DiagnosticReport m_DR(n, nX, m_constant_term, true, RegressModel); + m_DR = new DiagnosticReport(n, nX, m_constant_term, true, RegressModel); for (int i = 0; i < nX; i++) { - m_DR.SetXVarNames(i, m_Xnames[i]); + m_DR->SetXVarNames(i, m_Xnames[i]); } - m_DR.SetMeanY(ComputeMean(y, n)); - m_DR.SetSDevY(ComputeSdev(y, n)); + m_DR->SetMeanY(ComputeMean(y, n)); + m_DR->SetSDevY(ComputeSdev(y, n)); - classicalRegression(NULL, n, y, n, x, nX, &m_DR, + classicalRegression(NULL, n, y, n, x, nX, m_DR, m_constant_term, true, m_gauge, do_white_test); - m_resid1= m_DR.GetResidual(); - printAndShowClassicalResults(row_nm, y, table_int->GetTableName(), wxEmptyString, &m_DR, m_obs, nX, do_white_test); - m_yhat1 = m_DR.GetYHAT(); - - m_DR.release_Var(); + m_resid1= m_DR->GetResidual(); + printAndShowClassicalResults(row_nm, y, table_int->GetTableName(), wxEmptyString, m_DR, m_obs, nX, do_white_test); + m_yhat1 = m_DR->GetYHAT(); wxDateTime now = wxDateTime::Now(); logReport = ">>" + now.FormatDate() + " " + now.FormatTime() + "\nREGRESSION (DIFF-IN-DIFF, COMPARE REGIMES) \n----------\n" + logReport; } else if (compare_time_periods) { - m_Xnames.push_back("PERIOD_DUMMY"); + m_Xnames.push_back("TIME"); nX = m_Xnames.size(); int n1 = 0, n2 = 0; @@ -1284,30 +1321,29 @@ void LineChartFrame::RunDIDTest() } } - DiagnosticReport m_DR(n, nX, m_constant_term, true, RegressModel); + m_DR = new DiagnosticReport(n, nX, m_constant_term, true, RegressModel); for (int i = 0; i < nX; i++) { - m_DR.SetXVarNames(i, m_Xnames[i]); + m_DR->SetXVarNames(i, m_Xnames[i]); } - m_DR.SetMeanY(ComputeMean(y, n)); - m_DR.SetSDevY(ComputeSdev(y, n)); + m_DR->SetMeanY(ComputeMean(y, n)); + m_DR->SetSDevY(ComputeSdev(y, n)); - classicalRegression(NULL, n, y, n, x, nX, &m_DR, + classicalRegression(NULL, n, y, n, x, nX, m_DR, m_constant_term, true, m_gauge, do_white_test); - m_resid1= m_DR.GetResidual(); - printAndShowClassicalResults(row_nm, y, table_int->GetTableName(), wxEmptyString, &m_DR, m_obs, nX, do_white_test); - m_yhat1 = m_DR.GetYHAT(); + m_resid1= m_DR->GetResidual(); + printAndShowClassicalResults(row_nm, y, table_int->GetTableName(), wxEmptyString, m_DR, m_obs, nX, do_white_test); + m_yhat1 = m_DR->GetYHAT(); - m_DR.release_Var(); wxDateTime now = wxDateTime::Now(); logReport = ">>" + now.FormatDate() + " " + now.FormatTime() + "\nREGRESSION (DIFF-IN-DIFF, COMPARE TIME PERIOD) \n----------\n" + logReport; } else if (compare_r_and_t) { - m_Xnames.push_back("SPACE_DUMMY"); - m_Xnames.push_back("PERIOD_DUMMY"); - m_Xnames.push_back("INTERACTION"); + m_Xnames.push_back("SPACE"); + m_Xnames.push_back("TIME"); + m_Xnames.push_back("INTERACT"); nX = m_Xnames.size(); int n1 = 0, n2 = 0; @@ -1352,42 +1388,55 @@ void LineChartFrame::RunDIDTest() } } - DiagnosticReport m_DR(n, nX, m_constant_term, true, RegressModel); + m_DR = new DiagnosticReport(n, nX, m_constant_term, true, RegressModel); for (int i = 0; i < nX; i++) { - m_DR.SetXVarNames(i, m_Xnames[i]); + m_DR->SetXVarNames(i, m_Xnames[i]); } - m_DR.SetMeanY(ComputeMean(y, n)); - m_DR.SetSDevY(ComputeSdev(y, n)); + m_DR->SetMeanY(ComputeMean(y, n)); + m_DR->SetSDevY(ComputeSdev(y, n)); - classicalRegression(NULL, n, y, n, x, nX, &m_DR, + classicalRegression(NULL, n, y, n, x, nX, m_DR, m_constant_term, true, m_gauge, do_white_test); - m_resid1= m_DR.GetResidual(); - printAndShowClassicalResults(row_nm, y, table_int->GetTableName(), wxEmptyString, &m_DR, m_obs, nX, do_white_test); - m_yhat1 = m_DR.GetYHAT(); + m_resid1= m_DR->GetResidual(); + printAndShowClassicalResults(row_nm, y, table_int->GetTableName(), wxEmptyString, m_DR, m_obs, nX, do_white_test); + m_yhat1 = m_DR->GetYHAT(); - m_DR.release_Var(); wxDateTime now = wxDateTime::Now(); logReport = ">>" + now.FormatDate() + " " + now.FormatTime() + "\nREGRESSION (DIFF-IN-DIFF, COMPARE REGIMES AND TIME PERIOD) \n----------\n" + logReport; } - delete[] y; - for (int t=0; tConnect(wxEVT_DESTROY, wxWindowDestroyEventHandler(LineChartFrame::OnReportClose), NULL, this); + + } else { regReportDlg->AddNewReport(logReport); } regReportDlg->Show(true); regReportDlg->m_textbox->SetSelection(0, 0); + if (chk_save_did && chk_save_did->IsChecked()) { + wxMessageDialog saveDlg(this, "Do you want to save the results of Diff-in-Diff test?\n\nNote: the results can only be saved into an external data file, due to the change of cross-sectional observations in a space-time context.", "Save Diff-in-Diff Test Results", wxYES_NO | wxICON_QUESTION); + if (saveDlg.ShowModal() == wxID_YES) { + bool save_w = false; + bool save_did = true; + SaveDataAndResults(save_w, save_did, m_yhat1, m_resid1); + } + } + + delete[] y; + for (int t=0; trelease_Var(); + delete m_DR; } LOG_MSG("End LineChartFrame::RunDIDTest"); diff --git a/Explore/LineChartView.h b/Explore/LineChartView.h index 1408ee1a1..82abd635e 100644 --- a/Explore/LineChartView.h +++ b/Explore/LineChartView.h @@ -145,6 +145,8 @@ public HighlightStateObserver, public LineChartCanvasCallbackInt protected: + void SaveDataAndResults(bool save_weights, bool save_did=false, + double* m_yhat1=0, double* m_resid1=0); void SetupPanelForNumVariables(int num_vars); void UpdateMessageWin(); void UpdateTitleWin(); @@ -168,6 +170,7 @@ public HighlightStateObserver, public LineChartCanvasCallbackInt wxChoice* choice_time1; wxChoice* choice_time2; //wxCheckBox* chk_run_test; + wxCheckBox* chk_save_did; int has_selection; int has_excluded;