R Academy · पाठ

R में Stan मॉडल लिखना

Stan वाक्यविन्यास में डेटा ब्लॉक, पैरामीटर और मॉडल ब्लॉक परिभाषित करें।

पाठ 2, कुल 4 में से13 चरण

R में Stan मॉडल लिखना, CoddyKit पर R Academy का एक निःशुल्क पाठ है। यह 4 में से 2वाँ पाठ है। इस अध्ययन पथ के 3 तक कोई भी पाठ पूरा पढ़ना निःशुल्क है — इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ व्यावहारिक अभ्यास भी उपलब्ध कराता है। यह R Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। R Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

Stan क्या है

Stan बेज़ियन सांख्यिकीय मॉडलिंग के लिए एक प्रायिकतामूलक प्रोग्रामिंग भाषा है। RStan, Stan के लिए R इंटरफ़ेस है। आप मॉडल Stan की भाषा (C++ जैसी) में लिखते हैं और Stan उसे कुशल C++ कोड में संकलित करता है, जो पश्च वितरण का अनुमान लगाने के लिए Hamiltonian Monte Carlo (HMC) सैंपलिंग चलाता है।

# Stan installation check
library(rstan)

# Check version
cat('RStan version:', as.character(packageVersion('rstan')), '\n')

# Enable parallel chains
options(mc.cores = parallel::detectCores())

# Reuse compiled models across sessions
rstan_options(auto_write = TRUE)

cat('Stan ready. Cores:', parallel::detectCores(), '\n')

Stan मॉडल की संरचना

Stan मॉडल में अधिकतम छह नामित ब्लॉक होते हैं: data, transformed data, parameters, transformed parameters, model, और generated quantities। तीन आवश्यक ब्लॉक हैं: data, parameters, और model।

library(rstan)

# Stan model as a character string in R
stan_code <- '
data {
  int<lower=0> N;       // number of observations
  vector[N] x;          // predictor
  vector[N] y;          // response
}
parameters {
  real alpha;           // intercept
  real beta;            // slope
  real<lower=0> sigma;  // noise (must be positive)
}
model {
  // Priors
  alpha ~ normal(0, 10);
  beta  ~ normal(0, 10);
  sigma ~ exponential(1);

  // Likelihood
  y ~ normal(alpha + beta * x, sigma);
}
'

cat('Stan model defined as a string in R\n')
cat('Blocks: data, parameters, model\n')

data{}: इनपुट डेटा घोषित करना

data ब्लॉक उन सभी बाहरी डेटा को घोषित करता है जिन्हें मॉडल R से प्राप्त करता है। प्रकारों में int, real, vector[N], matrix[M,N], और array शामिल हैं। <lower=0> जैसी बाधाओं की जाँच रनटाइम पर की जाती है।

library(rstan)

# Comprehensive data block examples
data_block_examples <- '
data {
  // Scalars
  int<lower=1> N;               // at least 1 observation
  int<lower=2> K;               // at least 2 groups

  // Constrained scalars
  real<lower=0, upper=1> rate;  // probability

  // Vectors
  vector[N] y;                  // continuous response
  array[N] int<lower=0, upper=1> z;  // binary outcomes

  // Matrix
  matrix[N, K] X;               // design matrix

  // Integer array
  array[N] int group;           // group membership 1..K
}
'

cat(data_block_examples)

parameters{}: पैरामीटर के प्रकार

parameters ब्लॉक उन अज्ञात मानों की घोषणा करता है जिनसे Stan नमूने लेगा। इस ब्लॉक में दी गई बाधाएँ पैरामीटर का क्षेत्र निर्धारित करती हैं: धनात्मक मात्राओं के लिए <lower=0>, और प्रायिकताओं के लिए <lower=0, upper=1>। बाधित पैरामीटरों के लिए Stan लॉग-प्रायिकता के जैकोबियन सुधार अपने-आप लागू करता है।

library(rstan)

# Common parameter declarations
param_examples <- '
parameters {
  // Unconstrained
  real mu;                        // mean
  vector[K] beta;                 // regression coefficients

  // Positive (sigma, lambda, variance)
  real<lower=0> sigma;
  real<lower=0> lambda;

  // Probability
  real<lower=0, upper=1> theta;

  // Simplex (sums to 1, for mixture weights)
  simplex[K] pi;

  // Correlation matrix
  corr_matrix[K] Omega;

  // Cholesky factor of covariance
  cholesky_factor_cov[K] L_Sigma;
}
'
cat(param_examples)

model{}: पूर्व प्रायिकताएँ और संभावना

model ब्लॉक ~ (टिल्ड) सिंटैक्स के माध्यम से लॉग-पश्च प्रायिकता को संचित करता है। y ~ normal(mu, sigma) का संक्षिप्त रूप target में Normal PDF का लॉग जोड़ने के बराबर है। आप target += normal_lpdf(y | mu, sigma) के माध्यम से लॉग-प्रायिकता की स्पष्ट वृद्धियाँ लिख सकते हैं।

library(rstan)

model_block_example <- '
model {
  // --- Priors ---
  mu    ~ normal(0, 10);          // weakly informative
  sigma ~ cauchy(0, 2.5);         // half-Cauchy for scale
  beta  ~ normal(0, 1);           // standardised coefficients

  // --- Likelihood ---
  // Tilde notation (most common)
  y ~ normal(mu + X * beta, sigma);

  // Equivalent explicit notation:
  // target += normal_lpdf(y | mu + X * beta, sigma);

  // For loop (less common but valid)
  // for (i in 1:N)
  //   target += normal_lpdf(y[i] | mu, sigma);
}
'
cat(model_block_example)

एक सरल Normal मॉडल को फिट करना

यहाँ Stan का एक पूर्ण न्यूनतम कार्यप्रवाह दिया गया है: मॉडल स्ट्रिंग परिभाषित करें, डेटा सूची तैयार करें, stan() को कॉल करें, और print() से परिणामों का निरीक्षण करें। Stan पहली बार मॉडल को संकलित करता है और बाद के रन के लिए उसे कैश कर लेता है।

library(rstan)

# Stan model: estimate mean and SD of a normal distribution
normal_model <- '
data {
  int<lower=0> N;
  vector[N] y;
}
parameters {
  real mu;
  real<lower=0> sigma;
}
model {
  mu    ~ normal(0, 10);
  sigma ~ exponential(0.1);
  y     ~ normal(mu, sigma);
}
'

# Simulate data
set.seed(42)
y_data <- rnorm(50, mean = 5, sd = 2)

# Fit the model
fit <- stan(
  model_code = normal_model,
  data       = list(N = length(y_data), y = y_data),
  chains     = 2,
  iter       = 1000,
  warmup     = 500,
  refresh    = 0  # suppress iteration output
)

print(fit, pars = c('mu', 'sigma'))

Stan में रैखिक प्रतिगमन

Stan बेज़ियन रैखिक प्रतिगमन को सरल बनाता है: गुणांकों पर Normal पूर्व प्रायिकताएँ और sigma पर exponential या half-Cauchy पूर्व प्रायिकता निर्दिष्ट करें। पश्च प्रायिकता प्रत्येक गुणांक के लिए केवल बिंदु अनुमान नहीं, बल्कि अनिश्चितता का पूरा वितरण देती है।

library(rstan)

lin_reg_model <- '
data {
  int<lower=0> N;
  vector[N] x;
  vector[N] y;
}
parameters {
  real alpha;
  real beta;
  real<lower=0> sigma;
}
model {
  alpha ~ normal(0, 10);
  beta  ~ normal(0, 10);
  sigma ~ exponential(1);
  y ~ normal(alpha + beta * x, sigma);
}
generated quantities {
  vector[N] y_rep;  // posterior predictive
  for (i in 1:N)
    y_rep[i] = normal_rng(alpha + beta * x[i], sigma);
}
'

set.seed(7)
n <- 80
x <- rnorm(n); y <- 2 + 3 * x + rnorm(n, 0, 1)

fit <- stan(model_code = lin_reg_model,
            data = list(N = n, x = x, y = y),
            chains = 2, iter = 1000, refresh = 0)
print(fit, pars = c('alpha', 'beta', 'sigma'))

transformed parameters{} ब्लॉक

transformed parameters ब्लॉक नमूना लिए गए पैरामीटरों से व्युत्पन्न मात्राओं की गणना करता है। ये मॉडल को संख्यात्मक रूप से स्थिर तरीके से पैरामीटरित करने के लिए उपयोगी हैं, जैसे Cholesky अपघटन और लॉग-रूपांतरण, और साथ ही प्राथमिक पैरामीटरों को अर्थपूर्ण बनाए रखते हैं।

library(rstan)

# Model with transformed parameters
trans_param_example <- '
data {
  int<lower=0> N;
  array[N] int<lower=0> y;  // counts
}
parameters {
  real log_lambda;           // work in log space for stability
}
transformed parameters {
  real<lower=0> lambda;
  lambda = exp(log_lambda);  // transform back to original scale
}
model {
  log_lambda ~ normal(1, 2);  // prior on log scale
  y ~ poisson(lambda);
}
'

set.seed(42)
y_counts <- rpois(30, lambda = 5)

fit_poisson <- stan(
  model_code = trans_param_example,
  data       = list(N = length(y_counts), y = y_counts),
  chains     = 2, iter = 1000, refresh = 0
)
print(fit_poisson, pars = c('log_lambda', 'lambda'))

generated quantities{} ब्लॉक

generated quantities ब्लॉक नमूना-ग्रहण के बाद अतिरिक्त मात्राओं की गणना करने के लिए चलता है: पश्च पूर्वानुमानित नमूने (y_rep), LOO-CV के लिए लॉग-संभावना, या सारांशों के लिए रूपांतरित पैरामीटर। यहाँ के मान पश्च पूर्वानुमानित वितरण से लिए जाते हैं।

library(rstan)

# Use generated quantities for posterior predictive checks
model_with_gq <- '
data {
  int<lower=0> N;
  vector[N] y;
}
parameters {
  real mu;
  real<lower=0> sigma;
}
model {
  mu    ~ normal(0, 10);
  sigma ~ exponential(0.5);
  y     ~ normal(mu, sigma);
}
generated quantities {
  vector[N] y_rep;           // replicated datasets
  real mean_y_rep;           // mean of replicated data
  for (i in 1:N)
    y_rep[i] = normal_rng(mu, sigma);
  mean_y_rep = mean(y_rep);
}
'

set.seed(1)
y_obs <- rnorm(40, 3, 1.5)
fit <- stan(model_code = model_with_gq,
            data = list(N = length(y_obs), y = y_obs),
            chains = 2, iter = 1000, refresh = 0)
print(fit, pars = c('mu', 'sigma', 'mean_y_rep'))

R से Stan में डेटा भेजना

stan() का data आर्ग्युमेंट नामित R सूची होता है। नाम Stan के data{} ब्लॉक में घोषित चर के नामों से बिल्कुल मेल खाने चाहिए। वेक्टर Stan के vector[N] बन जाते हैं; पूर्णांक int बन जाते हैं; R मैट्रिक्स Stan के matrix[M,N] बन जाते हैं।

library(rstan)

# Data preparation: names must match Stan data block exactly
set.seed(42)
n <- 60
x1 <- rnorm(n)
x2 <- rnorm(n)
y  <- 1.5 + 2 * x1 - 0.8 * x2 + rnorm(n, 0, 0.5)

# Build the design matrix
X <- cbind(x1, x2)  # 60 x 2 matrix

# Named list passed to stan(data = ...)
stan_data <- list(
  N = n,          # int
  K = ncol(X),    # int
  X = X,          # matrix[N, K]
  y = y           # vector[N]
)

cat('Stan data list elements:\n')
for (nm in names(stan_data)) {
  cat(' ', nm, ': class =', class(stan_data[[nm]]),
      'dim =', paste(dim(stan_data[[nm]]), collapse = 'x'),
      '\n')
}

संकलित मॉडल देखना

फिटिंग के बाद सभी पैरामीटरों के लिए पश्च सारांश, जैसे mean, se_mean, sd, quantiles, Rhat और n_eff, देखने के लिए print(fit) का उपयोग करें। दृश्य अंतराल प्लॉट के लिए stan_plot(fit) और चेन के मिश्रण का आकलन करने के लिए traceplot(fit) का उपयोग करें।

library(rstan)

# Reuse the simple normal model from scene 6
normal_model <- '
data { int<lower=0> N; vector[N] y; }
parameters { real mu; real<lower=0> sigma; }
model {
  mu ~ normal(0, 10);
  sigma ~ exponential(0.1);
  y ~ normal(mu, sigma);
}
'

set.seed(5)
fit <- stan(model_code = normal_model,
            data = list(N = 50, y = rnorm(50, 7, 3)),
            chains = 2, iter = 1000, refresh = 0)

# Detailed summary table
print(fit)

# Extract as data frame
posterior_df <- as.data.frame(fit)
cat('\nPosterior samples shape:', nrow(posterior_df),
    'rows x', ncol(posterior_df), 'cols\n')

त्वरित जाँच

Stan मॉडल में आप किसी पैरामीटर को सख्ती से धनात्मक रखना चाहते हैं, जैसे मानक विचलन। कौन-सी घोषणा सही है?

पुनरावलोकन: Stan मॉडल लिखना

मुख्य बातें:

  • Stan मॉडल में तीन आवश्यक ब्लॉक होते हैं: data{}, parameters{}, model{}
  • बाधाएँ: प्रायिकताओं के लिए <lower=0>, <upper=1>, <lower=0, upper=1>
  • प्रकार: int, real, vector[N], matrix[M,N], simplex[K]
  • मॉडल ब्लॉक: पूर्व प्रायिकताओं और संभावना के लिए टिल्ड सिंटैक्स y ~ normal(mu, sigma) का उपयोग करें
  • व्युत्पन्न मात्राओं के लिए transformed parameters{}; नमूना-ग्रहण के बाद की गणनाओं के लिए generated quantities{}
  • डेटा को Stan ब्लॉक के नामों से बिल्कुल मेल खाती नामित R सूची के रूप में भेजें
  • rstan_options(auto_write = TRUE) संकलित मॉडलों को कैश करता है
library(rstan)

# Stan model skeleton
model_skeleton <- '
data    { int N; vector[N] y; }
parameters { real mu; real<lower=0> sigma; }
model   { mu ~ normal(0,10); sigma ~ exponential(1); y ~ normal(mu, sigma); }
'
cat(model_skeleton)
cat('\nFit with: stan(model_code = model_skeleton, data = list(N=..., y=...), chains=4)\n')
शुरुआत निःशुल्क

एआई शिक्षक के साथ R सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
43
पाठ
159

अक्सर पूछे जाने वाले प्रश्न

क्या “R में Stan मॉडल लिखना” पाठ निःशुल्क है?

हाँ — R Academy अध्ययन पथ के 3 तक कोई भी पाठ, जिसमें “R में Stan मॉडल लिखना” भी शामिल है, यहाँ वेब पर पूरा पढ़ना निःशुल्क है। इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ इंटरैक्टिव अभ्यास भी उपलब्ध कराता है। R Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“R में Stan मॉडल लिखना” में मैं क्या सीखूँगा?

Stan वाक्यविन्यास में डेटा ब्लॉक, पैरामीटर और मॉडल ब्लॉक परिभाषित करें। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ R Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या R Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर R Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 2वाँ पाठ है।

“R में Stan मॉडल लिखना” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस R Academy पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर R Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. बायज़ीय चिंतन का परिचय
  2. R में Stan मॉडल लिखना
  3. MCMC नमूनाकरण और निदान
  4. पश्च-वितरण पूर्वानुमानी जाँच
← R Academy पर वापस जाएँ