Implement Python Function for Statistical Test P-Values
Company: Roblox
Role: Data Scientist
Category: Coding & Algorithms
Difficulty: medium
Interview Round: Technical Screen
##### Scenario
You need a utility that calculates p-values for one-sided and two-sided statistical tests.
##### Question
Write a Python function `compute_p_value(stat, dist='z', df=None, alternative='two-sided')` that returns the p-value. Your code should support Z-tests and Student-t tests, and handle 'less', 'greater', and 'two-sided' alternatives.
##### Hints
Use the CDF of the chosen distribution; for two-sided tests return 2*min(CDF, 1-CDF). Libraries like scipy.stats are allowed.
Quick Answer: This question evaluates proficiency in statistical hypothesis testing, p-value interpretation, and implementing distribution-based calculations (Z and Student-t) in code, and it falls under the Coding & Algorithms domain for data scientist roles.
Implement compute_p_value(stat, dist='z', df=None, alternative='two-sided') that returns the p-value for one-sided and two-sided tests. For dist='z', use the standard normal distribution. For dist='t', use the Student's t distribution with degrees of freedom df (a positive integer). The alternative can be 'less', 'greater', or 'two-sided'. Compute p-values using the CDF of the chosen distribution: for 'less' return CDF(stat); for 'greater' return 1 - CDF(stat); for 'two-sided' return 2 * min(CDF(stat), 1 - CDF(stat)). Do not use external libraries. Return a float in [0, 1].
Constraints
- dist is 'z' or 't'
- alternative is 'less', 'greater', or 'two-sided'
- For dist='t', df is a positive integer (1 <= df <= 10^6)
- stat is a finite float (|stat| <= 1e6)
- Use only the Python standard library
- Return value within absolute error 1e-9 of the true p-value
Examples
Input:
Expected Output: 1.0
Input:
Expected Output: 0.75
Hints
- For the normal CDF, use erf: Phi(z) = 0.5 * (1 + erf(z / sqrt(2))).
- For the t-distribution CDF, use the regularized incomplete beta function: if t >= 0, F(t) = 1 - 0.5 * I_{nu/(nu + t^2)}(nu/2, 1/2); else F(t) = 0.5 * I_{nu/(nu + t^2)}(nu/2, 1/2).
- Compute the regularized incomplete beta via a continued fraction (Lentz's method).
- For two-sided tests, use 2 * min(CDF, 1 - CDF) and clamp results to [0,1].