| name | research-expert |
| version | 1.0.0 |
| description | Expert-level research methodology, academic writing, statistical analysis, and scientific investigation |
| category | scientific |
| tags | ["research","methodology","statistics","academic-writing","experimental-design"] |
| allowed-tools | ["Read","Write","Edit"] |
Research Methodology Expert
Expert guidance for research methodology, experimental design, statistical analysis, and academic writing.
Core Concepts
Research Design
- Experimental vs observational studies
- Randomized controlled trials (RCTs)
- Cross-sectional, longitudinal, cohort studies
- Case-control studies
- Systematic reviews and meta-analysis
- Sample size determination
Statistical Analysis
- Descriptive statistics
- Hypothesis testing
- Confidence intervals
- Regression analysis
- ANOVA and t-tests
- Non-parametric tests
- Multiple testing correction
Academic Writing
- Literature review
- Research proposals
- Manuscript structure (IMR AD)
- Citation management
- Peer review process
- Publishing ethics
Experimental Design
from dataclasses import dataclass
from typing import List, Optional
import numpy as np
from scipy import stats
@dataclass
class Study:
name: str
design_type: str
sample_size: int
groups: List[str]
primary_outcome: str
secondary_outcomes: List[str]
class SampleSizeCalculator:
"""Calculate required sample size for studies"""
@staticmethod
def two_sample_ttest(effect_size: float, alpha: float = 0.05,
power: float = 0.8) -> int:
"""Calculate sample size for two-sample t-test"""
from statsmodels.stats.power import tt_ind_solve_power
n = tt_ind_solve_power(
effect_size=effect_size,
alpha=alpha,
power=power,
alternative='two-sided'
)
return int(np.ceil(n))
@staticmethod
def proportion_test(p1: float, p2: float, alpha: = ,
power: = ) -> :
statsmodels.stats.power zt_ind_solve_power
effect_size = (p2 - p1) / np.sqrt(p1 * ( - p1))
n = zt_ind_solve_power(
effect_size=effect_size,
alpha=alpha,
power=power,
alternative=
)
(np.ceil(n))
:
():
.n_subjects = n_subjects
.n_groups = n_groups
() -> []:
np.random.choice(.n_groups, size=.n_subjects)
() -> []:
n_blocks = .n_subjects // block_size
assignments = []
_ (n_blocks):
block = np.repeat((.n_groups),
block_size // .n_groups)
np.random.shuffle(block)
assignments.extend(block)
remainder = .n_subjects % block_size
remainder > :
extra = np.random.choice(.n_groups, size=remainder)
assignments.extend(extra)
assignments
() -> []:
assignments = np.zeros(.n_subjects, dtype=)
stratum (strata):
stratum_indices = [i i, s (strata) s == stratum]
stratum_n = (stratum_indices)
stratum_assignments = np.random.choice(
.n_groups,
size=stratum_n,
replace=
)
idx, assignment (stratum_indices, stratum_assignments):
assignments[idx] = assignment
assignments
Statistical Analysis
import pandas as pd
from scipy import stats
import statsmodels.api as sm
from statsmodels.stats.multitest import multipletests
class StatisticalAnalysis:
"""Perform statistical analyses"""
@staticmethod
def descriptive_stats(data: pd.Series) -> dict:
"""Calculate descriptive statistics"""
return {
"mean": data.mean(),
"median": data.median(),
"std": data.std(),
"min": data.min(),
"max": data.max(),
"q25": data.quantile(0.25),
"q75": data.quantile(0.75),
"skewness": stats.skew(data),
"kurtosis": stats.kurtosis(data)
}
@staticmethod
def independent_ttest(group1: np.ndarray, group2: np.ndarray) -> dict:
"""Perform independent samples t-test"""
statistic, pvalue = stats.ttest_ind(group1, group2)
pooled_std = np.sqrt((group1.var() + group2.var()) / 2)
cohens_d = (group1.mean() - group2.mean()) / pooled_std
return {
"t_statistic": statistic,
"p_value": pvalue,
: cohens_d,
: group1.mean() - group2.mean(),
: pvalue <
}
() -> :
f_statistic, p_value = stats.f_oneway(*groups)
grand_mean = np.mean(np.concatenate(groups))
ss_between = ((g) * (g.mean() - grand_mean)** g groups)
ss_total = (((g - grand_mean)**).() g groups)
eta_squared = ss_between / ss_total
{
: f_statistic,
: p_value,
: eta_squared,
: p_value <
}
() -> :
X_with_const = sm.add_constant(X)
model = sm.OLS(y, X_with_const).fit()
{
: model.params.to_dict(),
: model.rsquared,
: model.rsquared_adj,
: model.fvalue,
: model.f_pvalue,
: model.summary()
}
() -> :
reject, pvals_corrected, alphacSidak, alphacBonf = multipletests(
p_values,
alpha=alpha,
method=method
)
{
: reject,
: pvals_corrected,
: reject.(),
: method
}
:
() -> :
pooled_std = np.sqrt((group1.var() + group2.var()) / )
(group1.mean() - group2.mean()) / pooled_std
() -> :
n1, n2 = (group1), (group2)
df = n1 + n2 -
correction = - ( / ( * df - ))
d = EffectSize.cohens_d(group1, group2)
d * correction
() -> :
np.sqrt(r_squared / ( - r_squared))
Literature Review
from typing import Dict, List
from dataclasses import dataclass
@dataclass
class Citation:
authors: List[str]
year: int
title: str
journal: str
volume: Optional[int] = None
pages: Optional[str] = None
doi: Optional[str] = None
def format_apa(self) -> str:
"""Format citation in APA style"""
authors_str = self._format_authors_apa()
citation = f"{authors_str} ({self.year}). {self.title}. {self.journal}"
if self.volume:
citation += f", {self.volume}"
if self.pages:
citation += f", {self.pages}"
if self.doi:
citation += f". https://doi.org/{self.doi}"
return citation + "."
def _format_authors_apa(self) -> :
(.authors) == :
.authors[]
(.authors) == :
:
:
():
.citations: [Citation] = []
.themes: [, [Citation]] = {}
():
.citations.append(citation)
theme themes:
theme .themes:
.themes[theme] = []
.themes[theme].append(citation)
() -> []:
style == :
[c.format_apa() c (
.citations,
key= x: (x.authors[], x.year)
)]
() -> [Citation]:
.themes.get(theme, [])
Best Practices
Research Design
- Pre-register studies when possible
- Calculate adequate sample sizes
- Use appropriate controls
- Randomize when applicable
- Blind assessors to reduce bias
- Consider confounding variables
- Document protocol deviations
Data Analysis
- Pre-specify analysis plan
- Check statistical assumptions
- Report effect sizes, not just p-values
- Apply multiple testing corrections
- Use appropriate statistical tests
- Report confidence intervals
- Make data and code available
Academic Writing
- Follow journal guidelines
- Use clear, precise language
- Report methodology in detail
- Discuss limitations openly
- Acknowledge conflicts of interest
- Properly cite all sources
- Use reference management software
Anti-Patterns
❌ P-hacking and data dredging
❌ HARKing (Hypothesizing After Results are Known)
❌ Cherry-picking results
❌ Inadequate sample sizes
❌ Ignoring failed experiments
❌ No pre-registration
❌ Selective reporting of outcomes
Resources