# Significance Testing in Tables - Column Comparisons on Grids with Lots of Missing Data

This rule runs an independent samples z-test on columns in a grid, testing at the 0.05 level and 0.10 level with no multiple comparison corrections. This rule is only provided for backwards compatibility. In general, it is preferable to instead use the Statistical Assumptions to control testing with missing data on grid questions (see Column Comparisons with Missing Data and Grid Questions) or using Significance Testing in Tables - Independent Samples Column Means and Proportions Tests.

## Technical details

• You must set Show significance to Compare columns in order for the results of this rule to be visible.
• The reason that some people use this test instead of the in-built tests in Q is that, in general, this rule uses equal or higher sample sizes to those used in Q. For example, if 20 people have provided data on one cell and 20 on another, but only 2 people have provided data for both cells, then the sample size of 2 would be used by default in Q's tests but 40 in the tests performed using this rule. Although this may seem a clear benefit, the problem is that, in general, the cells are not independent so the assumptions implicit in the application of this rule are rarely met in practice (the default test in Q is a related sample test). Additionally, this rule does not apply any Multiple Comparison Correction nor any other of the settings in Statistical Assumptions.
• Testing is conducted on NET and SUM categories.

## How to apply this rule

### For the first time in a project

• Select the table(s)/chart(s) that you wish to apply the rule to.
• Start typing the name of the Rule into the Search features and data box in the top right of the Q window.
• Click on the Rule when it appears in the QScripts and Rules section of the search results.

OR

• Select Automate > Browse Online Library.
• Choose this rule from the list.

### Additional applications of the rule

• Select a table or chart that has the rule and any table(s)/chart(s) that you wish to apply the rule to.
• Click on the Rules tab (bottom-left of the table/chart).
• Select the rule that you wish to apply.
• Click on the Apply drop-down and choose your desired option.
• Check New items to have it automatically applied to new items that you create. Use Edit > Project Options > Save as Template to create a new project template that automatically uses this rule.

## Removing the rule

• Select the table(s)/chart(s) that you wish to remove the rule from.
• Press the Rules tab (bottom-right corner).
• Press Apply next to the rule you wish to remove and choose the appropriate option.

## How to modify the rule

• Click on the Rules tab (bottom-left of the table/chart).
• Select the rule that you wish to modify.
• Click Edit Rule and make the desired changes. Alternatively, you can use the JavaScript below to make your own rule (see Customizing Rules).

## JavaScript

form.setSummary('Column Comparisons on grids with lots of missing data');
form.setHeading('Column Comparisons on Grids with Lots of Missing Data');

//Independent samples z-test with unequal variance

runProjectJavaScript() //Ensures that any JavaScript set for the entire project runs
//get the relevant statistics

if (table.availableStatistics.indexOf("Column Comparisons") == -1)
form.ruleNotApplicable("this table does not have Column Comparisons available");

let description = form.newLabel("Replace existing Column Comparisons results using an independent-samples z-test.");
description.lineBreakAfter = true;
let has_average = table.statistics.indexOf('Average') != -1;//checking if table has averages
let is_proportion = table.statistics.indexOf('%') != -1;//checking if table has percentages
if (!has_average && !is_proportion)
form.ruleNotApplicable("JavaScript for this table requires the table to have percentages or an average");
if (table.numberColumns > 26)
form.ruleNotApplicable("JavaScript for this table only works with 26 or fewer columns");
let se = table.get('Standard Error');
let cc = table.get('Column Comparisons');
let values = has_average ? table.get('Average') : table.get('%')

// Set up controls for user input.
let label1 = form.newLabel('Z-Statistic (lowercase letters):');
let numeric_lower  = form.newNumericUpDown('Lower');
numeric_lower.setIncrement(.005);
numeric_lower.setDefault(1.96);//test at approximately 0.05 level
numeric_lower.setMaximum(5);
numeric_lower.lineBreakAfter = true;
let label2 = form.newLabel('Z-Statistic (uppercase letters):');
let numeric_upper  = form.newNumericUpDown('Upper');
numeric_upper.setIncrement(.005);
numeric_upper.setDefault(1.645);//test at approximately 0.1 level
numeric_upper.setMaximum(5);
form.setInputControls([description, label1, numeric_lower, label2, numeric_upper]);

let lower_tstat = numeric_lower.requireValue();
let upper_tstat = numeric_upper.requireValue();

//removing current Column Comparisons
for (let row = 0; row < table.numberRows; row++) {
for (let column = 0; column < table.numberColumns; column++) {
cc[row][column] = '';
}
}
//  Doing the testing
let upper = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'];
let lower = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'];
for (let r = 0; r < table.numberRows; r++) {
for (let right_column = 1; right_column < table.numberColumns; right_column++) {
for (let left_column = 0; left_column < right_column; left_column++) {
let diff = values[r][left_column] - values[r][right_column];
let left_se = se[r][left_column];
let right_se = se[r][right_column];
let pooled_se = Math.sqrt(left_se*left_se + right_se*right_se)
let t = diff/pooled_se;
if (t < -lower_tstat)
cc[r][right_column] += upper[left_column] + " ";
else if (t < -upper_tstat)
cc[r][right_column] += lower[left_column] + " ";
else if (t > lower_tstat)
cc[r][left_column] += upper[right_column] + " ";
else if (t > upper_tstat)
cc[r][left_column] += lower[right_column] + " ";
}
}
}
table.set('Column Comparisons', cc);