计划执行与检查节点
executing-plans
按既定实施计划完成工作,保持过程检查和反馈。
ds-statistical-power【效率与协作】"Analyzes statistical power, sample size determination, effect size estimation, and Type I/Type II error control"
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
name: ds-statistical-power compatibility: opencode completeness: 95 content-types:
Comprehensive guide to statistical power in machine learning and data science workflows.
Statistical Power is a critical component of the machine learning workflow. This skill covers:
import numpy as np
from statsmodels.stats.power import TTestPower
def calculate_basic_power(effect_size: float, sample_size: int, alpha: float = 0.05) -> float:
"""Calculate statistical power for a two-sample t-test."""
if sample_size <= 0 or alpha <= 0 or alpha >= 1:
raise ValueError("Invalid parameters: sample_size must be > 0, alpha in (0, 1)")
power_analysis = TTestPower()
power = power_analysis.power(effect_size=effect_size, nobs=sample_size, alpha=alpha)
return float(np.clip(power, 0.0, 1.0))
# Example usage
if __name__ == "__main__":
es: float = 0.5 # Medium effect size (Cohen's d)
n: int = 50 # Sample size per group
alpha: float = 0.05
calculated_power: float = calculate_basic_power(es, n, alpha)
print(f"Statistical Power: {calculated_power:.4f}")
import logging
import numpy as np
import pandas as pd
from typing import Any, Dict, Literal
from statsmodels.stats.power import TTestPower
logger = logging.getLogger(__name__)
class StatisticalPowerAnalyzer:
"""Production-grade statistical power analysis tool."""
def __init__(self, alpha: float = 0.05, alternative: Literal['two-sided', 'larger', 'smaller'] = 'two-sided') -> None:
self.alpha: float = alpha
self.alternative: str = alternative
self.ttest: TTestPower = TTestPower()
def calculate_power(self, effect_size: float, sample_size: int) -> float:
"""Calculate power given effect size and sample size."""
if sample_size <= 0 or effect_size < 0:
raise ValueError("Sample size must be positive and effect size non-negative")
return float(self.ttest.power(effect_size=effect_size, nobs=sample_size, alpha=self.alpha))
def calculate_sample_size(self, effect_size: float, target_power: float) -> int:
"""Calculate required sample size for target power."""
if target_power <= 0 or target_power >= 1:
raise ValueError("Target power must be between 0 and 1")
nobs: float = self.ttest.solve_power(effect_size=effect_size, power=target_power, alpha=self.alpha)
return int(np.ceil(nobs))
def execute(self, data: pd.DataFrame, target_power: float = 0.8) -> Dict[str, Any]:
"""Execute power analysis on provided data."""
if data.empty:
raise ValueError("Input DataFrame cannot be empty")
group_a: pd.Series = data['group_a'].dropna()
group_b: pd.Series = data['group_b'].dropna()
pooled_std: float = np.sqrt(((len(group_a) - 1) * group_a.var() + (len(group_b) - 1) * group_b.var()) / (len(group_a) + len(group_b) - 2))
effect_size: float = abs(group_a.mean() - group_b.mean()) / pooled_std if pooled_std > 0 else 0.0
current_power: float = self.calculate_power(effect_size, len(group_a))
required_n: int = self.calculate_sample_size(effect_size, target_power)
logger.info(f"Calculated effect size: {effect_size:.4f}, Current power: {current_power:.4f}")
return {
'effect_size': float(effect_size)
'current_power': float(current_power)
'required_sample_size': required_n
'target_power': target_power
'alpha': self.alpha
}
# BAD: Hardcoded values, no validation, ignores statistical assumptions
def bad_power_calc(data):
return 0.8 # Magic number, no calculation
# GOOD: Parameterized, validated, uses established statistical library
def good_power_calc(effect_size: float, n: int, alpha: float = 0.05) -> float:
if n <= 0 or not (0 < alpha < 1):
raise ValueError("Invalid parameters")
from statsmodels.stats.power import TTestPower
return float(TTestPower().power(effect_size=effect_size, nobs=n, alpha=alpha))
| Pitfall | Problem | Solution | |
Authoritative documentation links for this skill's domain. The model follows markdown links at load time to resolve external references and inline content.