Skip to content

Commit

Permalink
Fix bonferroni cutoff sigmap & conditonal cluster map (#2406)
Browse files Browse the repository at this point in the history
* if use custom inference, use num_cats (which could be less than) instead of def_cats.size()
* fix conditional cluster map allow one dimension
* Update version.h
* Update install_name.py
* fix conditional cluster map with time-enabled variable
  • Loading branch information
lixun910 committed Nov 6, 2022
1 parent b312585 commit 7f542c7
Show file tree
Hide file tree
Showing 11 changed files with 117 additions and 54 deletions.
4 changes: 4 additions & 0 deletions BuildTools/macosx/code_sign.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,10 @@ def ProcessDependency(dylib_path, cid):

if dylib_path == '@rpath/libgeos.3.11.0.dylib':
dylib_path = '/opt/homebrew/opt/geos/lib/libgeos.3.11.0.dylib'
if dylib_path == '@loader_path/libicuuc.71.dylib':
dylib_path = '/opt/homebrew/opt/icu4c/lib/libicuuc.71.dylib'
if dylib_path == '@loader_path/libicudata.71.dylib':
dylib_path = '/opt/homebrew/opt/icu4c/lib/libicudata.71.dylib'

print("Process:", dylib_path)
#cmd = "codesign -f -s - "
Expand Down
6 changes: 6 additions & 0 deletions BuildTools/macosx/install_name.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,18 @@ def ProcessDependency(dir_path, dylib_name):

# workaround for gdal 3.3.3 that @rpath/libgeos.3.10.2.dylib was used instead of dir path
copyitem = item
if item == '@rpath/libgeos.3.10.2.dylib':
copyitem = '/usr/local/opt/geos/lib/libgeos.dylib'
if item == '@rpath/libgeos.3.11.0.dylib':
copyitem = '/usr/local/opt/geos/lib/libgeos.dylib'
if item == '@loader_path/libicuuc.70.dylib':
copyitem = '/usr/local/opt/icu4c/lib/libicuuc.70.dylib'
if item == '@loader_path/libicuuc.71.dylib':
copyitem = '/usr/local/opt/icu4c/lib/libicuuc.71.dylib'
if item == '@loader_path/libicudata.70.dylib':
copyitem = '/usr/local/opt/icu4c/lib/libicudata.70.dylib'
if item == '@loader_path/libicudata.71.dylib':
copyitem = '/usr/local/opt/icu4c/lib/libicudata.71.dylib'

if item.startswith('/usr/lib') == False and item.startswith('/System') == False and (codesign_only or item.startswith('@executable_path/')==False):
print("Process:", item)
Expand Down
4 changes: 2 additions & 2 deletions Explore/AbstractClusterMap.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -337,8 +337,8 @@ void AbstractMapCanvas::CreateAndUpdateCategories()
} else if (cluster[i] == 6) {
cat_data.AppendIdToCategory(t, undefined_cat, i);
} else {
//cat_data.AppendIdToCategory(t, (sigCat[i]-s_f)+1, i);
for ( int c = def_cats.size()-1; c >= 0; c-- ) {
// if use custom inference, use num_cats instead of def_cats.size()
for ( int c = num_cats - 1; c >= 0; c-- ) {
if ( p[i] <= def_cutoffs[c] ) {
cat_data.AppendIdToCategory(t, level_cat_dict[c], i);
break;
Expand Down
91 changes: 55 additions & 36 deletions Explore/ConditionalClusterMapView.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1080,11 +1080,12 @@ void ConditionalLISAClusterMapCanvas::CreateAndUpdateCategories()
cat_var_sorted.resize(num_time_vals);
cat_var_undef.resize(num_time_vals);
int lisa_time = lisa_coord->num_time_vals;
int lisa_t = 0;
int lisa_t = project->GetTimeState()->GetCurrTime();
for (int t=0; t<num_time_vals; t++) {
cat_var_sorted[t].resize(num_obs);
cat_var_undef[t].resize(num_obs);
if (t < lisa_time-1) lisa_t = t;
if (t < lisa_time-1)
lisa_t = t;
int* clst = lisa_coord->GetClusterIndicators(lisa_t);
for (int i=0; i<num_obs; i++) {
cat_var_sorted[t][i].first = clst[i];
Expand Down Expand Up @@ -1116,13 +1117,13 @@ void ConditionalLISAClusterMapCanvas::CreateAndUpdateCategories()
int num_time = lisa_coord->num_time_vals;
int num_obs = lisa_coord->num_obs;
cat_data.CreateEmptyCategories(num_time_vals, num_obs);
lisa_t = 0;
for (int t=0; t<num_time_vals; t++) {
int undefined_cat = -1;
int isolates_cat = -1;
int num_cats = 0;
double stop_sig = 0;
if (lisa_t < num_time -1) lisa_t = t;
if (lisa_t < num_time -1)
lisa_t = t;
if (lisa_coord->GetHasIsolates(lisa_t))
num_cats++;
if (lisa_coord->GetHasUndefined(lisa_t))
Expand Down Expand Up @@ -1298,18 +1299,23 @@ void ConditionalGClusterMapCanvas::CreateAndUpdateCategories()
// we do not allow smoothing with multiple time variables.
cat_var_sorted.resize(num_time_vals);
cat_var_undef.resize(num_time_vals);
int lisa_time = g_coord->num_time_vals;
int lisa_t = project->GetTimeState()->GetCurrTime();

for (int t=0; t<num_time_vals; t++) {
cat_var_sorted[t].resize(num_obs);
cat_var_undef[t].resize(num_obs);

if (t < lisa_time-1) lisa_t = t;

vector<wxInt64> cluster;
g_coord->FillClusterCats(t, is_gi, is_perm, cluster);
g_coord->FillClusterCats(lisa_t, is_gi, is_perm, cluster);

for (int i=0; i<num_obs; i++) {
cat_var_sorted[t][i].first = cluster[i];
cat_var_sorted[t][i].second = i;

cat_var_undef[t][i] = g_coord->data_undef[0][t][i];
cat_var_undef[t][i] = g_coord->data_undef[0][lisa_t][i];
}
}

Expand Down Expand Up @@ -1341,10 +1347,11 @@ void ConditionalGClusterMapCanvas::CreateAndUpdateCategories()
int isolates_cat = -1;
int num_cats = 0;
double stop_sig = 0;

if (g_coord->GetHasIsolates(t))
if (lisa_t < num_time -1)
lisa_t = t;
if (g_coord->GetHasIsolates(lisa_t))
num_cats++;
if (g_coord->GetHasUndefined(t))
if (g_coord->GetHasUndefined(lisa_t))
num_cats++;

num_cats += 3;
Expand All @@ -1362,14 +1369,14 @@ void ConditionalGClusterMapCanvas::CreateAndUpdateCategories()
cat_data.SetCategoryLabel(t, 2, _("Low"));
cat_data.SetCategoryColor(t, 2, wxColour(0, 0, 255));

if (g_coord->GetHasIsolates(t) &&
g_coord->GetHasUndefined(t))
if (g_coord->GetHasIsolates(lisa_t) &&
g_coord->GetHasUndefined(lisa_t))
{
isolates_cat = 3;
undefined_cat = 4;
} else if (g_coord->GetHasUndefined(t)) {
} else if (g_coord->GetHasUndefined(lisa_t)) {
undefined_cat = 3;
} else if (g_coord->GetHasIsolates(t)) {
} else if (g_coord->GetHasIsolates(lisa_t)) {
isolates_cat = 3;
}

Expand All @@ -1383,7 +1390,7 @@ void ConditionalGClusterMapCanvas::CreateAndUpdateCategories()
}

vector<wxInt64> cluster;
g_coord->FillClusterCats(t, is_gi, is_perm, cluster);
g_coord->FillClusterCats(lisa_t, is_gi, is_perm, cluster);

for (int i=0, iend=g_coord->num_obs; i<iend; i++) {
if (cluster[i] == 0) {
Expand Down Expand Up @@ -1511,15 +1518,20 @@ void ConditionalLocalGearyClusterMapCanvas::CreateAndUpdateCategories()
cat_var_sorted.resize(num_time_vals);
cat_var_undef.resize(num_time_vals);

int lisa_time = local_geary_coord->num_time_vals;
int lisa_t = project->GetTimeState()->GetCurrTime();

for (int t=0; t<num_time_vals; t++) {
cat_var_sorted[t].resize(num_obs);
cat_var_undef[t].resize(num_obs);

if (t < lisa_time-1) lisa_t = t;

for (int i=0; i<num_obs; i++) {
cat_var_sorted[t][i].first = local_geary_coord->cluster_vecs[t][i];
cat_var_sorted[t][i].first = local_geary_coord->cluster_vecs[lisa_t][i];
cat_var_sorted[t][i].second = i;

cat_var_undef[t][i] = local_geary_coord->undef_data[0][t][i];
cat_var_undef[t][i] = local_geary_coord->undef_data[0][lisa_t][i];
}
}

Expand Down Expand Up @@ -1551,10 +1563,11 @@ void ConditionalLocalGearyClusterMapCanvas::CreateAndUpdateCategories()
int isolates_cat = -1;
int num_cats = 0;
double stop_sig = 0;
if (lisa_t < num_time -1) lisa_t = t;

if (local_geary_coord->GetHasIsolates(t))
if (local_geary_coord->GetHasIsolates(lisa_t))
num_cats++;
if (local_geary_coord->GetHasUndefined(t))
if (local_geary_coord->GetHasUndefined(lisa_t))
num_cats++;

num_cats += 5;
Expand All @@ -1578,13 +1591,13 @@ void ConditionalLocalGearyClusterMapCanvas::CreateAndUpdateCategories()
cat_data.SetCategoryColor(t, 3, wxColour(253,219,199));
cat_data.SetCategoryLabel(t, 4, _("Negative"));
cat_data.SetCategoryColor(t, 4, wxColour(103,173,199));
if (local_geary_coord->GetHasIsolates(t) &&
local_geary_coord->GetHasUndefined(t)) {
if (local_geary_coord->GetHasIsolates(lisa_t) &&
local_geary_coord->GetHasUndefined(lisa_t)) {
isolates_cat = 5;
undefined_cat = 6;
} else if (local_geary_coord->GetHasUndefined(t)) {
} else if (local_geary_coord->GetHasUndefined(lisa_t)) {
undefined_cat = 5;
} else if (local_geary_coord->GetHasIsolates(t)) {
} else if (local_geary_coord->GetHasIsolates(lisa_t)) {
isolates_cat = 5;
}

Expand All @@ -1598,9 +1611,9 @@ void ConditionalLocalGearyClusterMapCanvas::CreateAndUpdateCategories()
}

double cuttoff = local_geary_coord->significance_cutoff;
double* p = local_geary_coord->sig_local_geary_vecs[t];
int* cluster = local_geary_coord->cluster_vecs[t];
int* sigCat = local_geary_coord->sig_cat_vecs[t];
double* p = local_geary_coord->sig_local_geary_vecs[lisa_t];
int* cluster = local_geary_coord->cluster_vecs[lisa_t];
int* sigCat = local_geary_coord->sig_cat_vecs[lisa_t];

for (int i=0, iend=local_geary_coord->num_obs; i<iend; i++) {
if (p[i] > cuttoff && cluster[i] != 5 && cluster[i] != 6) {
Expand Down Expand Up @@ -1725,15 +1738,20 @@ void ConditionalLocalJoinCountClusterMapCanvas::CreateAndUpdateCategories()
cat_var_sorted.resize(num_time_vals);
cat_var_undef.resize(num_time_vals);

int lisa_time = local_jc_coord->num_time_vals;
int lisa_t = project->GetTimeState()->GetCurrTime();

for (int t=0; t<num_time_vals; t++) {
cat_var_sorted[t].resize(num_obs);
cat_var_undef[t].resize(num_obs);

if (t < lisa_time-1) lisa_t = t;

for (int i=0; i<num_obs; i++) {
cat_var_sorted[t][i].first = local_jc_coord->local_jc_vecs[t][i];
cat_var_sorted[t][i].first = local_jc_coord->local_jc_vecs[lisa_t][i];
cat_var_sorted[t][i].second = i;

cat_var_undef[t][i] = local_jc_coord->undef_tms[t][i];
cat_var_undef[t][i] = local_jc_coord->undef_tms[lisa_t][i];
}
}

Expand Down Expand Up @@ -1765,10 +1783,11 @@ void ConditionalLocalJoinCountClusterMapCanvas::CreateAndUpdateCategories()
int isolates_cat = -1;
int num_cats = 0;
double stop_sig = 0;

if (local_jc_coord->GetHasIsolates(t))
if (lisa_t < num_time -1)
lisa_t = t;
if (local_jc_coord->GetHasIsolates(lisa_t))
num_cats++;
if (local_jc_coord->GetHasUndefined(t))
if (local_jc_coord->GetHasUndefined(lisa_t))
num_cats++;

num_cats += 5;
Expand All @@ -1790,13 +1809,13 @@ void ConditionalLocalJoinCountClusterMapCanvas::CreateAndUpdateCategories()
cat_data.SetCategoryColor(t, 2, wxColour(0, 255, 0));
cat_data.SetCategoryLabel(t, 3, _("Colocation Cluster"));
cat_data.SetCategoryColor(t, 3, wxColour(255,0,0));
if (local_jc_coord->GetHasIsolates(t) &&
local_jc_coord->GetHasUndefined(t)) {
if (local_jc_coord->GetHasIsolates(lisa_t) &&
local_jc_coord->GetHasUndefined(lisa_t)) {
isolates_cat = 4;
undefined_cat = 5;
} else if (local_jc_coord->GetHasUndefined(t)) {
} else if (local_jc_coord->GetHasUndefined(lisa_t)) {
undefined_cat = 4;
} else if (local_jc_coord->GetHasIsolates(t)) {
} else if (local_jc_coord->GetHasIsolates(lisa_t)) {
isolates_cat = 4;
}

Expand All @@ -1810,9 +1829,9 @@ void ConditionalLocalJoinCountClusterMapCanvas::CreateAndUpdateCategories()
}

double cuttoff = local_jc_coord->significance_cutoff;
double* p = local_jc_coord->sig_local_jc_vecs[t];
double* p = local_jc_coord->sig_local_jc_vecs[lisa_t];
std::vector<wxInt64> cluster;
local_jc_coord->FillClusterCats(t,cluster);
local_jc_coord->FillClusterCats(lisa_t, cluster);

for (int i=0, iend=local_jc_coord->num_obs; i<iend; i++) {
if (p[i] > cuttoff && cluster[i] != 4 && cluster[i] != 5) {
Expand Down
10 changes: 8 additions & 2 deletions Explore/GetisOrdMapNewView.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1059,8 +1059,14 @@ void GetisOrdMapFrame::OnSelectCoresAndNeighbors(wxCommandEvent& event)

void GetisOrdMapFrame::OnShowAsConditionalMap(wxCommandEvent& event)
{
VariableSettingsDlg dlg(project, VariableSettingsDlg::bivariate,
false, false,
int style = VariableSettingsDlg::ALLOW_STRING_IN_FIRST | VariableSettingsDlg::ALLOW_STRING_IN_SECOND |
VariableSettingsDlg::ALLOW_EMPTY_IN_FIRST |
VariableSettingsDlg::ALLOW_EMPTY_IN_SECOND;


VariableSettingsDlg dlg(project,
VariableSettingsDlg::bivariate,
style,
_("Conditional G Cluster Map Variables"),
_("Horizontal Cells"),
_("Vertical Cells"));
Expand Down
18 changes: 13 additions & 5 deletions Explore/LisaCoordinator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -486,6 +486,9 @@ void LisaCoordinator::Calc()
Gal_vecs[t] = gw;
Gal_vecs_orig[t] = weights;

double reference_val = using_median
? GenUtils::Median(data1, num_obs, undefs) : 0;

for (int i=0; i<num_obs; i++) {
lags[i] = 0;
localMoran[i] = 0;
Expand Down Expand Up @@ -528,14 +531,19 @@ void LisaCoordinator::Calc()
if (data1) {
localMoran[i] = data1[i] * Wdata;
}

// assign the cluster
//if (W[i].Size() > 0) {
if (data1) {
if (data1[i] > 0 && Wdata < 0) cluster[i] = 4;
else if (data1[i] < 0 && Wdata > 0) cluster[i] = 3;
else if (data1[i] < 0 && Wdata < 0) cluster[i] = 2;
else cluster[i] = 1; //data1[i] > 0 && Wdata > 0
if (data1[i] > reference_val && Wdata < reference_val) {
cluster[i] = 4;
} else if (data1[i] < reference_val && Wdata > reference_val) {
cluster[i] = 3;
} else if (data1[i] < reference_val && Wdata < reference_val) {
cluster[i] = 2;
} else {
cluster[i] = 1; //data1[i] > 0 && Wdata > 0
}
}
}
}
Expand Down
14 changes: 9 additions & 5 deletions Explore/LisaMapNewView.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -338,12 +338,16 @@ void LisaMapFrame::OnSaveResult(wxCommandEvent& event)

void LisaMapFrame::OnShowAsConditionalMap(wxCommandEvent& event)
{
VariableSettingsDlg dlg(project, VariableSettingsDlg::bivariate,
false, false,
int style = VariableSettingsDlg::ALLOW_STRING_IN_FIRST | VariableSettingsDlg::ALLOW_STRING_IN_SECOND |
VariableSettingsDlg::ALLOW_EMPTY_IN_FIRST |
VariableSettingsDlg::ALLOW_EMPTY_IN_SECOND;

VariableSettingsDlg dlg(project,
VariableSettingsDlg::bivariate,
style,
_("Conditional LISA Map Variables"),
_("Horizontal Cells"), _("Vertical Cells"),
"", "", false, false, false, // default
true, true, false, false);
_("Horizontal Cells"),
_("Vertical Cells"));

if (dlg.ShowModal() != wxID_OK) {
return;
Expand Down
8 changes: 6 additions & 2 deletions Explore/LocalGearyMapNewView.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1127,9 +1127,13 @@ void LocalGearyMapFrame::OnSelectCoresAndNeighbors(wxCommandEvent& event)
void LocalGearyMapFrame::OnShowAsConditionalMap(wxCommandEvent& event)
{
wxLogMessage("In LocalGearyMapFrame::OnShowAsConditionalMap");
int style = VariableSettingsDlg::ALLOW_STRING_IN_FIRST | VariableSettingsDlg::ALLOW_STRING_IN_SECOND |
VariableSettingsDlg::ALLOW_EMPTY_IN_FIRST |
VariableSettingsDlg::ALLOW_EMPTY_IN_SECOND;

VariableSettingsDlg dlg(project, VariableSettingsDlg::bivariate,
false, false,
VariableSettingsDlg dlg(project,
VariableSettingsDlg::bivariate,
style,
_("Conditional Local Geary Map Variables"),
_("Horizontal Cells"),
_("Vertical Cells"));
Expand Down
11 changes: 11 additions & 0 deletions GenUtils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1331,6 +1331,17 @@ double GenUtils::Median(std::vector<double>& data)
return 0.5 * (data[n/2 -1] + data[n/2]);
}

double GenUtils::Median(double* data, int n, const std::vector<bool>& undefs)
{
std::vector<double> valid_data;
for (int i = 0; i < n; ++i) {
if (!undefs[i]) {
valid_data.push_back(data[i]);
}
}
return Median(valid_data);
}

void GenUtils::DeviationFromMean(int nObs, double* data)
{
if (nObs == 0) return;
Expand Down
1 change: 1 addition & 0 deletions GenUtils.h
Original file line number Diff line number Diff line change
Expand Up @@ -377,6 +377,7 @@ namespace GenUtils {

double Sum(vector<double>& data);
double Median(std::vector<double>& data);
double Median(double* data, int n, const std::vector<bool>& undefs);

double SumOfSquares(vector<double>& data);
double SumOfSquaresMedian(vector<double>& data);
Expand Down
Loading

0 comments on commit 7f542c7

Please sign in to comment.