I. Creating a function to evaluate \(t\)-tests from summary statistics only

Neither native R nor its Mosaic package have versions of the \(t\)-tests for use when only the summary statistics are known. However, we can create them ourselves based on our statistics formulas.

One-Sample \(t\)-test

The one-sample \(t\)-statistic is given by \[t = \frac{\bar x - \mu_0}{\frac{s}{\sqrt{n}}}\] with p-values from the \(t\)-distribution with degrees of freedom \[df = n-1\]

Knowing the formulas, you should be able see how things are calculated in the function below once you realize the the function pt finds the exact p-value based a \(t\)-statistic and degrees of freedom. The function my.t.test returns the two-tailed p-value only. The parameter mu defaults to zero but may be set to match \(\mu_0\).

my.t.test = function(m, s, n, mu = 0)
{
  df = n-1
  se = s/sqrt(n)
  t = (m-mu)/(se)
  # Calculate left-tail p-value, then double it for two-tailed p-value
  p = 2*pt(-abs(t),df)
  dat = c(se, df, t, p)
  names(dat) = c("Std Error", "Deg Freedom", "t", "p-value")
return(dat) 
}

Example 1

Suppose we are testing the reliability of a machine that fills 12 ounce aluminum cans with a soft drink. After sampling, we find the following data:

\[\begin{array}{ccc}\bar x && s && n \\ \hline 11.9 && 0.1 && 50 \end{array}\]

We can test the hypothesis that the machine is underfilling the cans using the 0.05 level.

\[H_0 : \mu = 12 \\ H_0 : \mu < 12 \]

We put the summary statistics in, and make sure to set the value \(\mu_0 = 12\) as our last argument.

my.t.test(11.9, 0.2, 50, mu = 12)
   Std Error  Deg Freedom            t      p-value 
 0.028284271 49.000000000 -3.535533906  0.000900003 

If you run the same test on your TI graphing calculator, you will find the same results if you use a two-tailed test. Here, however, our alternative hypothesis specified a one-tailed test, but we can simply divide our p-value in half to get the correct value. Again, you can check this by comparing to you graphing calculator.

II. Creating a function to evaluate 2-sample \(t\)-tests from summary statistics only

For two-sample testing, the correct statistic is given by

\[t = \frac{\bar x_1 - \bar x_2}{\sqrt{\frac{s_1^2}{n_1}+\frac{s_2^2}{n_2}}}\]

with conservative p-values from the \(t\)-distribution with degrees of freedom:

\[df = \min(n_1 - 1 , n_2 - 1)\]

However, most modern statistics apps use the Welch \(t\)-test which should be used whenever we assume unequal variances – which we should in basically all cases. We are testing for unequal means, so assuming equal variances is more than just counter-intuitive. The Welch version of Student’s (William Sealy Gosset’s) \(t\)-test adjusts the degrees of freedom for better accuracy when the standard deviations are, indeed, different. The degrees of freedom calculation is a bit messy, but don’t worry, we’ll just let R do the calculations for us.

\[df = \frac{\left(\frac{s_1^2}{n_1} + \frac{s_2^2}{n_2}\right)^2}{\frac{\left(\frac{s_1^2}{n_1}\right)^2}{n_1-1}+\frac{\left(\frac{s_2^2}{n_2}\right)^2}{n_2-1}}\]

Here’s the code. Notice the p-value is calculated by finding the area corresponding to a one-tailed test, and then doubled.

myWelch.t.test = function(m1,m2,s1,s2,n1,n2)
{
  se = sqrt( (s1^2/n1) + (s2^2/n2) )
  # welch-satterthwaite degrees of freedom
  df = ( (s1^2/n1 + s2^2/n2)^2 )/( (s1^2/n1)^2/(n1-1) + (s2^2/n2)^2/(n2-1) )
  t = (m1-m2)/se
  # Calculate left-tail p-value, then double it for two-tailed p-value
  p = 2*pt(-abs(t),df)
  dat = c(m1-m2, se, df, t, p)
  names(dat) = c("Mean Diff", "Std Error", "Deg Freedom", "t", "p-value")
return(dat) 
}

Example 2

Who’s more optimistic? A recent survey measured optimism levels and asked participants their biological sex. Test for a significant difference in Optimism based upon Sex at the 0.05 level given the data table below.

\[\begin{array}{lcc} &\textbf{Females} & \textbf{Males}\\ \hline \textbf{AVG} & 28.5 & 30.0 \\ \textbf{SD} & 4.9 & 5.7 \\ \textbf{N} & 130 & 74 \end{array}\]

We simply plug in the values to our Welch \(t\)-test function.

myWelch.t.test(28.5, 30, 4.9, 5.9, 130, 74)
   Mean Diff    Std Error  Deg Freedom            t      p-value 
 -1.50000000   0.80938107 130.21690377  -1.85326796   0.06610732 

Since the alternative hypothesis specified a two-tailed, the p-value given in the table is correct, and we fail to reject the null.

III. How to use these functions

If you would like to use these functions, just open this notebook in RStudio and run the code blocks associated with the two \(t\)-test functions. Executing their code blocks will load them into R’s working memory for the current session. Return to your notebook, and implement them as shown in the examples.

You do not need to copy the code blocks into your working notebook. Just execute them from this notebook during any session where you need them.

LS0tDQp0aXRsZTogIkNyZWF0aW5nICR0JC10ZXN0cyBmb3IgdXNlIGluIFIgd2hlbiBvbmx5IHN1bW1hcnkgc3RhdGlzdGljcyBhcmUgYXZhaWxhYmxlIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6IGJsdWU7Ij5JLiBDcmVhdGluZyBhIGZ1bmN0aW9uIHRvIGV2YWx1YXRlICR0JC10ZXN0cyBmcm9tIHN1bW1hcnkgc3RhdGlzdGljcyBvbmx5PC9zcGFuPg0KTmVpdGhlciBuYXRpdmUgUiBub3IgaXRzIE1vc2FpYyBwYWNrYWdlIGhhdmUgdmVyc2lvbnMgb2YgdGhlICR0JC10ZXN0cyBmb3IgdXNlIHdoZW4gb25seSB0aGUgc3VtbWFyeSBzdGF0aXN0aWNzIGFyZSBrbm93bi4gSG93ZXZlciwgd2UgY2FuIGNyZWF0ZSB0aGVtIG91cnNlbHZlcyBiYXNlZCBvbiBvdXIgc3RhdGlzdGljcyBmb3JtdWxhcy4NCg0KIyBPbmUtU2FtcGxlICR0JC10ZXN0DQoNClRoZSBvbmUtc2FtcGxlICR0JC1zdGF0aXN0aWMgaXMgZ2l2ZW4gYnkgJCR0ID0gXGZyYWN7XGJhciB4IC0gXG11XzB9e1xmcmFje3N9e1xzcXJ0e259fX0kJCB3aXRoIHAtdmFsdWVzIGZyb20gdGhlICR0JC1kaXN0cmlidXRpb24gd2l0aCBkZWdyZWVzIG9mIGZyZWVkb20gJCRkZiA9IG4tMSQkDQoNCktub3dpbmcgdGhlIGZvcm11bGFzLCB5b3Ugc2hvdWxkIGJlIGFibGUgc2VlIGhvdyB0aGluZ3MgYXJlIGNhbGN1bGF0ZWQgaW4gdGhlIGZ1bmN0aW9uIGJlbG93IG9uY2UgeW91IHJlYWxpemUgdGhlIHRoZSBmdW5jdGlvbiAqKnB0KiogZmluZHMgdGhlIGV4YWN0IHAtdmFsdWUgYmFzZWQgYSAkdCQtc3RhdGlzdGljIGFuZCBkZWdyZWVzIG9mIGZyZWVkb20uIFRoZSBmdW5jdGlvbiAqKm15LnQudGVzdCoqIHJldHVybnMgdGhlICp0d28tdGFpbGVkKiBwLXZhbHVlIG9ubHkuIFRoZSBwYXJhbWV0ZXIgKiptdSoqIGRlZmF1bHRzIHRvIHplcm8gYnV0IG1heSBiZSBzZXQgdG8gbWF0Y2ggJFxtdV8wJC4NCg0KYGBge3J9DQpteS50LnRlc3QgPSBmdW5jdGlvbihtLCBzLCBuLCBtdSA9IDApDQp7DQogIGRmID0gbi0xDQogIHNlID0gcy9zcXJ0KG4pDQogIHQgPSAobS1tdSkvKHNlKQ0KICAjIENhbGN1bGF0ZSBsZWZ0LXRhaWwgcC12YWx1ZSwgdGhlbiBkb3VibGUgaXQgZm9yIHR3by10YWlsZWQgcC12YWx1ZQ0KICBwID0gMipwdCgtYWJzKHQpLGRmKQ0KICBkYXQgPSBjKHNlLCBkZiwgdCwgcCkNCiAgbmFtZXMoZGF0KSA9IGMoIlN0ZCBFcnJvciIsICJEZWcgRnJlZWRvbSIsICJ0IiwgInAtdmFsdWUiKQ0KcmV0dXJuKGRhdCkgDQp9DQpgYGANCg0KIyMjIEV4YW1wbGUgMQ0KDQpTdXBwb3NlIHdlIGFyZSB0ZXN0aW5nIHRoZSByZWxpYWJpbGl0eSBvZiBhIG1hY2hpbmUgdGhhdCBmaWxscyAxMiBvdW5jZSBhbHVtaW51bSBjYW5zIHdpdGggYSBzb2Z0IGRyaW5rLiBBZnRlciBzYW1wbGluZywgd2UgZmluZCB0aGUgZm9sbG93aW5nIGRhdGE6DQoNCiQkXGJlZ2lue2FycmF5fXtjY2N9XGJhciB4ICYmIHMgJiYgbiBcXCBcaGxpbmUgMTEuOSAmJiAwLjEgJiYgNTAgXGVuZHthcnJheX0kJA0KDQpXZSBjYW4gdGVzdCB0aGUgaHlwb3RoZXNpcyB0aGF0IHRoZSBtYWNoaW5lIGlzIHVuZGVyZmlsbGluZyB0aGUgY2FucyB1c2luZyB0aGUgMC4wNSBsZXZlbC4NCg0KJCRIXzAgOiBcbXUgPSAxMiBcXCBIXzAgOiBcbXUgPCAxMiAkJA0KDQpXZSBwdXQgdGhlIHN1bW1hcnkgc3RhdGlzdGljcyBpbiwgYW5kIG1ha2Ugc3VyZSB0byBzZXQgdGhlIHZhbHVlICRcbXVfMCA9IDEyJCBhcyBvdXIgbGFzdCBhcmd1bWVudC4NCg0KYGBge3J9DQpteS50LnRlc3QoMTEuOSwgMC4yLCA1MCwgbXUgPSAxMikNCmBgYA0KSWYgeW91IHJ1biB0aGUgc2FtZSB0ZXN0IG9uIHlvdXIgVEkgZ3JhcGhpbmcgY2FsY3VsYXRvciwgeW91IHdpbGwgZmluZCB0aGUgc2FtZSByZXN1bHRzICppZiB5b3UgdXNlIGEgdHdvLXRhaWxlZCB0ZXN0Ki4gSGVyZSwgaG93ZXZlciwgb3VyIGFsdGVybmF0aXZlIGh5cG90aGVzaXMgc3BlY2lmaWVkIGEgb25lLXRhaWxlZCB0ZXN0LCBidXQgd2UgY2FuIHNpbXBseSBkaXZpZGUgb3VyIHAtdmFsdWUgaW4gaGFsZiB0byBnZXQgdGhlIGNvcnJlY3QgdmFsdWUuIEFnYWluLCB5b3UgY2FuIGNoZWNrIHRoaXMgYnkgY29tcGFyaW5nIHRvIHlvdSBncmFwaGluZyBjYWxjdWxhdG9yLg0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjogYmx1ZTsiPklJLiBDcmVhdGluZyBhIGZ1bmN0aW9uIHRvIGV2YWx1YXRlIDItc2FtcGxlICR0JC10ZXN0cyBmcm9tIHN1bW1hcnkgc3RhdGlzdGljcyBvbmx5PC9zcGFuPg0KDQpGb3IgdHdvLXNhbXBsZSB0ZXN0aW5nLCB0aGUgY29ycmVjdCBzdGF0aXN0aWMgaXMgZ2l2ZW4gYnkNCg0KJCR0ID0gXGZyYWN7XGJhciB4XzEgLSBcYmFyIHhfMn17XHNxcnR7XGZyYWN7c18xXjJ9e25fMX0rXGZyYWN7c18yXjJ9e25fMn19fSQkDQoNCndpdGggY29uc2VydmF0aXZlIHAtdmFsdWVzIGZyb20gdGhlICR0JC1kaXN0cmlidXRpb24gd2l0aCBkZWdyZWVzIG9mIGZyZWVkb206DQoNCiQkZGYgPSBcbWluKG5fMSAtIDEgLCBuXzIgLSAxKSQkDQoNCkhvd2V2ZXIsIG1vc3QgbW9kZXJuIHN0YXRpc3RpY3MgYXBwcyB1c2UgdGhlIFdlbGNoICR0JC10ZXN0IHdoaWNoIHNob3VsZCBiZSB1c2VkIHdoZW5ldmVyIHdlIGFzc3VtZSB1bmVxdWFsIHZhcmlhbmNlcyAtLSB3aGljaCB3ZSBzaG91bGQgaW4gYmFzaWNhbGx5IGFsbCBjYXNlcy4gV2UgYXJlIHRlc3RpbmcgZm9yIHVuZXF1YWwgbWVhbnMsIHNvIGFzc3VtaW5nICplcXVhbCogdmFyaWFuY2VzIGlzIG1vcmUgdGhhbiBqdXN0IGNvdW50ZXItaW50dWl0aXZlLiBUaGUgV2VsY2ggdmVyc2lvbiBvZiBTdHVkZW50J3MgKFdpbGxpYW0gU2VhbHkgR29zc2V0J3MpICR0JC10ZXN0IGFkanVzdHMgdGhlIGRlZ3JlZXMgb2YgZnJlZWRvbSBmb3IgYmV0dGVyIGFjY3VyYWN5IHdoZW4gdGhlIHN0YW5kYXJkIGRldmlhdGlvbnMgYXJlLCBpbmRlZWQsIGRpZmZlcmVudC4gVGhlIGRlZ3JlZXMgb2YgZnJlZWRvbSBjYWxjdWxhdGlvbiBpcyBhIGJpdCBtZXNzeSwgYnV0IGRvbid0IHdvcnJ5LCB3ZSdsbCBqdXN0IGxldCBSIGRvIHRoZSBjYWxjdWxhdGlvbnMgZm9yIHVzLg0KDQokJGRmID0gXGZyYWN7XGxlZnQoXGZyYWN7c18xXjJ9e25fMX0gKyBcZnJhY3tzXzJeMn17bl8yfVxyaWdodCleMn17XGZyYWN7XGxlZnQoXGZyYWN7c18xXjJ9e25fMX1ccmlnaHQpXjJ9e25fMS0xfStcZnJhY3tcbGVmdChcZnJhY3tzXzJeMn17bl8yfVxyaWdodCleMn17bl8yLTF9fSQkDQoNCg0KSGVyZSdzIHRoZSBjb2RlLiBOb3RpY2UgdGhlIHAtdmFsdWUgaXMgY2FsY3VsYXRlZCBieSBmaW5kaW5nIHRoZSBhcmVhIGNvcnJlc3BvbmRpbmcgdG8gYSBvbmUtdGFpbGVkIHRlc3QsIGFuZCB0aGVuIGRvdWJsZWQuDQoNCmBgYHtyfQ0KbXlXZWxjaC50LnRlc3QgPSBmdW5jdGlvbihtMSxtMixzMSxzMixuMSxuMikNCnsNCiAgc2UgPSBzcXJ0KCAoczFeMi9uMSkgKyAoczJeMi9uMikgKQ0KICAjIHdlbGNoLXNhdHRlcnRod2FpdGUgZGVncmVlcyBvZiBmcmVlZG9tDQogIGRmID0gKCAoczFeMi9uMSArIHMyXjIvbjIpXjIgKS8oIChzMV4yL24xKV4yLyhuMS0xKSArIChzMl4yL24yKV4yLyhuMi0xKSApDQogIHQgPSAobTEtbTIpL3NlDQogICMgQ2FsY3VsYXRlIGxlZnQtdGFpbCBwLXZhbHVlLCB0aGVuIGRvdWJsZSBpdCBmb3IgdHdvLXRhaWxlZCBwLXZhbHVlDQogIHAgPSAyKnB0KC1hYnModCksZGYpDQogIGRhdCA9IGMobTEtbTIsIHNlLCBkZiwgdCwgcCkNCiAgbmFtZXMoZGF0KSA9IGMoIk1lYW4gRGlmZiIsICJTdGQgRXJyb3IiLCAiRGVnIEZyZWVkb20iLCAidCIsICJwLXZhbHVlIikNCnJldHVybihkYXQpIA0KfQ0KYGBgDQoNCiMjIyBFeGFtcGxlIDINCg0KV2hv4oCZcyBtb3JlIG9wdGltaXN0aWM/IEEgcmVjZW50IHN1cnZleSBtZWFzdXJlZCBvcHRpbWlzbSBsZXZlbHMgYW5kIGFza2VkIHBhcnRpY2lwYW50cyB0aGVpciBiaW9sb2dpY2FsIHNleC4gVGVzdCBmb3IgYSBzaWduaWZpY2FudCBkaWZmZXJlbmNlIGluIE9wdGltaXNtIGJhc2VkIHVwb24gU2V4IGF0IHRoZSAwLjA1IGxldmVsIGdpdmVuIHRoZSBkYXRhIHRhYmxlIGJlbG93Lg0KDQokJFxiZWdpbnthcnJheX17bGNjfSAmXHRleHRiZntGZW1hbGVzfSAmIFx0ZXh0YmZ7TWFsZXN9XFwgXGhsaW5lDQpcdGV4dGJme0FWR30gJiAyOC41ICYgMzAuMCBcXA0KXHRleHRiZntTRH0gJiA0LjkgJiA1LjcgXFwNClx0ZXh0YmZ7Tn0gJiAxMzAgJiA3NA0KXGVuZHthcnJheX0kJA0KDQpXZSBzaW1wbHkgcGx1ZyBpbiB0aGUgdmFsdWVzIHRvIG91ciBXZWxjaCAkdCQtdGVzdCBmdW5jdGlvbi4NCg0KYGBge3J9DQpteVdlbGNoLnQudGVzdCgyOC41LCAzMCwgNC45LCA1LjksIDEzMCwgNzQpDQpgYGANCg0KU2luY2UgdGhlIGFsdGVybmF0aXZlIGh5cG90aGVzaXMgc3BlY2lmaWVkIGEgdHdvLXRhaWxlZCwgdGhlIHAtdmFsdWUgZ2l2ZW4gaW4gdGhlIHRhYmxlIGlzIGNvcnJlY3QsIGFuZCB3ZSBmYWlsIHRvIHJlamVjdCB0aGUgbnVsbC4NCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6IGJsdWU7Ij5JSUkuIEhvdyB0byB1c2UgdGhlc2UgZnVuY3Rpb25zPC9zcGFuPg0KDQpJZiB5b3Ugd291bGQgbGlrZSB0byB1c2UgdGhlc2UgZnVuY3Rpb25zLCBqdXN0IG9wZW4gdGhpcyBub3RlYm9vayBpbiBSU3R1ZGlvIGFuZCBydW4gdGhlIGNvZGUgYmxvY2tzIGFzc29jaWF0ZWQgd2l0aCB0aGUgdHdvICR0JC10ZXN0IGZ1bmN0aW9ucy4gRXhlY3V0aW5nIHRoZWlyIGNvZGUgYmxvY2tzIHdpbGwgbG9hZCB0aGVtIGludG8gUidzIHdvcmtpbmcgbWVtb3J5IGZvciB0aGUgY3VycmVudCBzZXNzaW9uLiBSZXR1cm4gdG8geW91ciBub3RlYm9vaywgYW5kIGltcGxlbWVudCB0aGVtIGFzIHNob3duIGluIHRoZSBleGFtcGxlcy4NCg0KWW91ICpkbyBub3QgbmVlZCogdG8gY29weSB0aGUgY29kZSBibG9ja3MgaW50byB5b3VyIHdvcmtpbmcgbm90ZWJvb2suIEp1c3QgZXhlY3V0ZSB0aGVtIGZyb20gdGhpcyBub3RlYm9vayBkdXJpbmcgYW55IHNlc3Npb24gd2hlcmUgeW91IG5lZWQgdGhlbS4NCg0KDQo=