contact@mightymetrika.com

Informative Hypothesis Testing

December 8, 2023

In its essence, informative hypothesis testing (IHT) is a familiar concept to most who are familiar with the t-test. A two-tailed t-test can be used to test:


Ho: sample mean = 10

Ha: sample mean ≠ 10


If the test is conducted at the 0.05 alpha level, then we will reject the null hypothesis if:


  • The mean is in the lower 2.5% of the distribution
  • The mean is in the upper 2.5% of the distribution


The two-tailed test is simultaneously testing if if the mean is significantly greater the 10 and if the mean is significantly less than 10. On the other hand, a one-tailed t-test can be used to test (we choose mean > 10 for this example but we could also work an example with mean < 10):


Ho: sample mean = 10

Ha: sample mean > 10


If the test is conducted at the 0.05 alpha level, then we will reject the null hypothesis if:


  • The mean is in the upper 5% of the distribution


The one-tailed test which focuses on the upper tail of the distribution will miss a significant effect associated with the lower tail of the distribution. The one-tailed test gains statistical power at the expense of potentially missing a significant effect in the untested tail of the distribution.


A one-tailed t-test is an example of an IHT.

When is IHT Appropriate?

What I fear is a research project that does not conduct a proper power analysis before data collection and then, upon realizing that the sample size is less than ideal, a decision is made to use a one-tailed t-test rather than a two tailed t-test. With this fear in mind, I like the stats.oarc.ucla advice:


"If you consider the consequences of missing an effect in the untested direction and conclude that they are negligible and in no way irresponsible or unethical, then you can proceed with a one-tailed test."


Let's also consider the issue from a more optimistic perspective. As a working statistician, I often work with researchers, clinicians, and professionals who have a lot of experience and intuition when it comes to reasoning about the qualitative properties of the variables' distributions, correlations between pairs of variables, and how variables change over time under a condition of interest. With this experience and intuition in mind, I like what Vanbrabant and Rosseel (2020) explain:


"In many psychological fields, researchers have specific expectations about the relation between the means of different groups or between (standardized) regression coefficients...In observational studies, researchers often have clear ideas about whether the direction of the effects is positive or negative (see, for example, Richardson, Abraham, & Bond, 2012), indicated by symbols like “<” and “>”. Testing such specific expectations directly is known under various names, such as one-sided testing, order-constrained hypothesis testing, constrained statistical inference, and informative hypothesis testing."


Personally, if I am to use IHT, I would want to pre-register the study so that I can specify that I am using IHT and specify the "constraints" (see below for more on constraints) data collection begins. This would allow the sample size estimation to be informed by the IHT.

Extending IHT

The concept of IHT can be extended to linear regression, ANOVA, generalized linear models, robust regression, mixed effects models, structural equation models and more. In the R programming language, software is available for implementing IHT in both the frequentist and the Bayesian frameworks of statistics. I personally use the following in each each domain:



Click on one of the above links to learn more about implementing IHT in R. Both links have examples, tutorials, and literature that will get you up and running with IHT. While there are important differences between the software packages, both of them use a similar workflow:


  • Fit a statistical model in the regular fashion
  • Specify a constraint (i.e., "Group1 > Group2")
  • Pass the fitted model and the constraints to a specialized IHT function
  • Interpret the results
August 19, 2024
Mighty Metrika focuses on statistical methods and mathematics for the analysis of small sample size data. As such, the project runs the risk of people with small sample sizes using tools and methods from mightymetrika.com and becoming over confident in their results because they used "small sample size methods." The long term rigorous goal to combat this disservice is to host citizen science projects, include simulation function in R packages, and share simulation results from the literature and from mightymetrika.com tools through blogs. A short and quick way to combat misuse is through the Who Said It Best series. The series will share some of the best warnings from the small sample size statistical literature. In the Conclusion section of Daniel McNeish's paper Challenging Conventional Wisdom for Multivariate Statistical Models With Small Samples he shares a clear and wonderfully worded warning:
June 25, 2024
This is a quick blog post to list some of the essential resources that I needed to get a citizen science app up and running. The app uses: R Shiny PostgreSQL Pool AWS EC2 The post is basically a way for me to bookmark resources that I found useful and also as a way to say thank you to the folks that put these resources up online.
June 10, 2024
In 'mmibain' v0.2.0, the unit tests are passing at the moment, but on r-devel-linux-x86_64-debian-clang it really seems to be hit or miss. I believe that when the test fails it is do to the new BFfe function which is a case-by-case type implementation of ' bain ' for linear models; however, I used a unit test which relies on a synthetic data set where I generated random numbers and then just used the rep() function to group observations by participants. As such, the data generating process does fit the statistical model and sometimes the random data set that is generated does not make it through bain::bain() without error. I have already changed the unit test and corresponding Roxygen2 documentation example on the Mighty Metrika GitHub and this blog post will walk through the new data and model. But just for further context, here is the original code that sometimes runs through and sometimes throws and error.
More Posts
Share by: