نماذج التأثيرات المختلطة الخطية

عرض على TensorFlow.org تشغيل في Google Colab عرض المصدر على جيثب تحميل دفتر

نموذج التأثيرات المختلطة الخطية هو نهج بسيط لنمذجة العلاقات الخطية المنظمة (Harville، 1997؛ Laird and Ware، 1982). تتكون كل نقطة بيانات من مدخلات من نوع مختلف - مصنفة في مجموعات - ومخرجات ذات قيمة حقيقية. نموذج آثار مختلطة الخطي هو نموذج هرمي: تشترك معها قوة إحصائية بين المجموعات من أجل تحسين استنتاجات حول أي نقطة البيانات الفردية.

في هذا البرنامج التعليمي ، نعرض نماذج التأثيرات المختلطة الخطية مع مثال واقعي في TensorFlow Probability. سنستخدم JointDistributionCoroutine وماركوف سلسلة مونت كارلو ( tfp.mcmc ) وحدات.

التبعيات والمتطلبات

الاستيراد والإعداد

اجعل الأمور سريعة!

قبل أن نتعمق ، دعنا نتأكد من أننا نستخدم وحدة معالجة الرسومات لهذا العرض التوضيحي.

للقيام بذلك ، حدد "وقت التشغيل" -> "تغيير نوع وقت التشغيل" -> "مسرع الأجهزة" -> "GPU".

سيتحقق المقتطف التالي من أن لدينا حق الوصول إلى وحدة معالجة الرسومات.

if tf.test.gpu_device_name() != '/device:GPU:0':
  print('WARNING: GPU device not found.')
else:
  print('SUCCESS: Found GPU: {}'.format(tf.test.gpu_device_name()))
SUCCESS: Found GPU: /device:GPU:0

البيانات

نحن نستخدم InstEval مجموعة البيانات من شعبية lme4 الحزمة في R (بيتس وآخرون، 2015). إنها مجموعة بيانات من الدورات وتقييمات تقييمها. وتشمل كل دورة ميتاداتا مثل students ، instructors ، و departments ، ومتغير استجابة الفائدة هو تصنيف التقييم.

def load_insteval():
  """Loads the InstEval data set.

  It contains 73,421 university lecture evaluations by students at ETH
  Zurich with a total of 2,972 students, 2,160 professors and
  lecturers, and several student, lecture, and lecturer attributes.
  Implementation is built from the `observations` Python package.

  Returns:
    Tuple of np.ndarray `x_train` with 73,421 rows and 7 columns and
    dictionary `metadata` of column headers (feature names).
  """
  url = ('https://raw.github.com/vincentarelbundock/Rdatasets/master/csv/'
         'lme4/InstEval.csv')
  with requests.Session() as s:
    download = s.get(url)
    f = download.content.decode().splitlines()

  iterator = csv.reader(f)
  columns = next(iterator)[1:]
  x_train = np.array([row[1:] for row in iterator], dtype=np.int)
  metadata = {'columns': columns}
  return x_train, metadata

نقوم بتحميل مجموعة البيانات ومعالجتها مسبقًا. نحمل 20٪ من البيانات حتى نتمكن من تقييم نموذجنا المجهز على نقاط بيانات غير مرئية. أدناه نتخيل الصفوف القليلة الأولى.

data, metadata = load_insteval()
data = pd.DataFrame(data, columns=metadata['columns'])
data = data.rename(columns={'s': 'students',
                            'd': 'instructors',
                            'dept': 'departments',
                            'y': 'ratings'})
data['students'] -= 1  # start index by 0
# Remap categories to start from 0 and end at max(category).
data['instructors'] = data['instructors'].astype('category').cat.codes
data['departments'] = data['departments'].astype('category').cat.codes

train = data.sample(frac=0.8)
test = data.drop(train.index)

train.head()

أنشأنا مجموعة البيانات من حيث features القاموس المدخلات و labels الانتاج الموافق التصنيف. يتم ترميز كل ميزة على أنها عدد صحيح ويتم ترميز كل تسمية (تصنيف تقييم) كرقم فاصلة عائمة.

get_value = lambda dataframe, key, dtype: dataframe[key].values.astype(dtype)
features_train = {
    k: get_value(train, key=k, dtype=np.int32)
    for k in ['students', 'instructors', 'departments', 'service']}
labels_train = get_value(train, key='ratings', dtype=np.float32)

features_test = {k: get_value(test, key=k, dtype=np.int32)
                 for k in ['students', 'instructors', 'departments', 'service']}
labels_test = get_value(test, key='ratings', dtype=np.float32)
num_students = max(features_train['students']) + 1
num_instructors = max(features_train['instructors']) + 1
num_departments = max(features_train['departments']) + 1
num_observations = train.shape[0]

print("Number of students:", num_students)
print("Number of instructors:", num_instructors)
print("Number of departments:", num_departments)
print("Number of observations:", num_observations)
Number of students: 2972
Number of instructors: 1128
Number of departments: 14
Number of observations: 58737

نموذج

يفترض النموذج الخطي النموذجي الاستقلال ، حيث يكون لأي زوج من نقاط البيانات علاقة خطية ثابتة. في InstEval مجموعة البيانات، تنشأ الملاحظات في مجموعات كل واحدة منها قد يكون المنحدرات وقراءتها متفاوتة. نماذج التأثيرات المختلطة الخطية ، والمعروفة أيضًا بالنماذج الخطية الهرمية أو النماذج الخطية متعددة المستويات ، تلتقط هذه الظاهرة (Gelman & Hill ، 2006).

من أمثلة هذه الظاهرة ما يلي:

  • الطلاب. ملاحظات الطالب ليست مستقلة: قد يعطي بعض الطلاب درجات منخفضة (أو عالية) من المحاضرات بشكل منهجي.
  • المدربين. ملاحظات المعلم ليست مستقلة: نتوقع أن يحصل المعلمون الجيدون بشكل عام على تقييمات جيدة وأن يحصل المعلمون السيئون على تقييمات سيئة بشكل عام.
  • الإدارات. الملاحظات من القسم ليست مستقلة: قد تحتوي بعض الأقسام بشكل عام على مواد جافة أو درجات أكثر صرامة وبالتالي يتم تصنيفها أقل من غيرها.

للقبض على هذا، أذكر أن لمجموعة بيانات \(N\times D\) يتميز \(\mathbf{X}\) و \(N\) تسميات \(\mathbf{y}\)، يفترض الانحدار الخطي نموذج

\[ \begin{equation*} \mathbf{y} = \mathbf{X}\beta + \alpha + \epsilon, \end{equation*} \]

حيث يوجد ناقل المنحدر \(\beta\in\mathbb{R}^D\)، اعتراض \(\alpha\in\mathbb{R}\)، والضجيج العشوائي \(\epsilon\sim\text{Normal}(\mathbf{0}, \mathbf{I})\). ونحن نقول ان \(\beta\) و \(\alpha\) هي "الآثار الثابتة": فهي آثار ثابتة عبر السكان من نقاط البيانات \((x, y)\). صيغة معادلة من المعادلة كما هي احتمال \(\mathbf{y} \sim \text{Normal}(\mathbf{X}\beta + \alpha, \mathbf{I})\). تم تكبير هذا احتمال خلال الاستدلال من أجل إيجاد تقديرات نقطة \(\beta\) و \(\alpha\) التي تتلاءم مع البيانات.

يمتد نموذج التأثيرات المختلطة الخطية إلى الانحدار الخطي مثل

\[ \begin{align*} \eta &\sim \text{Normal}(\mathbf{0}, \sigma^2 \mathbf{I}), \\ \mathbf{y} &= \mathbf{X}\beta + \mathbf{Z}\eta + \alpha + \epsilon. \end{align*} \]

حيث لا يزال هناك ناقلات المنحدر \(\beta\in\mathbb{R}^P\)، اعتراض \(\alpha\in\mathbb{R}\)، والضجيج العشوائي \(\epsilon\sim\text{Normal}(\mathbf{0}, \mathbf{I})\). وبالإضافة إلى ذلك، هناك مصطلح \(\mathbf{Z}\eta\)، حيث \(\mathbf{Z}\) هو مصفوفة الميزات و \(\eta\in\mathbb{R}^Q\) هو متجه من المنحدرات عشوائية؛ \(\eta\) يتم توزيعها بشكل طبيعي مع المعلمة عنصر التباين \(\sigma^2\). \(\mathbf{Z}\) يتكون من تقسيم الأصلي \(N\times D\) يتميز مصفوفة من حيث جديدة \(N\times P\) مصفوفة \(\mathbf{X}\) و \(N\times Q\) مصفوفة \(\mathbf{Z}\)، حيث \(P + Q=D\): هذا القسم يسمح لنا نموذج الميزات بشكل منفصل باستخدام الآثار الثابتة \(\beta\) والمتغير الكامنة \(\eta\) على التوالي.

نقول المتغيرات الكامنة \(\eta\) هي "آثار عشوائية": هم الآثار التي تختلف باختلاف السكان (على الرغم من أنها قد تكون ثابتة عبر القطعان). على وجه الخصوص، لأن الآثار العشوائية \(\eta\) يكون متوسط 0، يتم التقاطها يعني تسمية البيانات عن طريق \(\mathbf{X}\beta + \alpha\). الآثار العشوائية المكونة \(\mathbf{Z}\eta\) يلتقط الاختلافات في البيانات: على سبيل المثال، "مدرب # 54 تم تصنيف 1.4 نقطة أعلى من المتوسط."

في هذا البرنامج التعليمي ، نفترض التأثيرات التالية:

  • الآثار الثابتة: service . service هي متغيرا ثنائي المقابلة إذا كانت بالطبع ينتمي إلى القسم الرئيسي المعلم. مهما بيانات إضافية بكثير نجمعها، فإنه يمكن أن يتم إلا على القيم \(0\) و \(1\).
  • التأثيرات العشوائية: students ، instructors ، و departments . بالنظر إلى المزيد من الملاحظات من مجموعة تقييمات تقييم الدورة التدريبية ، فقد ننظر إلى الطلاب أو المعلمين أو الأقسام الجديدة.

في صيغة حزمة lme4 الخاصة بـ R (Bates et al. ، 2015) ، يمكن تلخيص النموذج على النحو التالي:

ratings ~ service + (1|students) + (1|instructors) + (1|departments) + 1

حيث x يدل على تأثير ثابت، (1|x) يدل على تأثير عشوائي ل x ، و 1 يدل على المدى اعتراض.

نطبق هذا النموذج أدناه كتوزيع مشترك. لتقديم دعم أفضل لتتبع المعلمة (على سبيل المثال، نحن نريد أن تتبع كل tf.Variable في model.trainable_variables )، علينا أن ننفذ قالب النموذج بوصفه tf.Module .

class LinearMixedEffectModel(tf.Module):
  def __init__(self):
    # Set up fixed effects and other parameters.
    # These are free parameters to be optimized in E-steps
    self._intercept = tf.Variable(0., name="intercept")            # alpha in eq
    self._effect_service = tf.Variable(0., name="effect_service")  #  beta in eq
    self._stddev_students = tfp.util.TransformedVariable(
        1., bijector=tfb.Exp(), name="stddev_students")            # sigma in eq
    self._stddev_instructors = tfp.util.TransformedVariable(
        1., bijector=tfb.Exp(), name="stddev_instructors")         # sigma in eq
    self._stddev_departments = tfp.util.TransformedVariable(
        1., bijector=tfb.Exp(), name="stddev_departments")         # sigma in eq

  def __call__(self, features):
    model = tfd.JointDistributionSequential([
      # Set up random effects.
      tfd.MultivariateNormalDiag(
          loc=tf.zeros(num_students),
          scale_identity_multiplier=self._stddev_students),
      tfd.MultivariateNormalDiag(
          loc=tf.zeros(num_instructors),
          scale_identity_multiplier=self._stddev_instructors),
      tfd.MultivariateNormalDiag(
          loc=tf.zeros(num_departments),
          scale_identity_multiplier=self._stddev_departments),
      # This is the likelihood for the observed.
      lambda effect_departments, effect_instructors, effect_students: tfd.Independent(
          tfd.Normal(
              loc=(self._effect_service * features["service"] +
                  tf.gather(effect_students, features["students"], axis=-1) +
                  tf.gather(effect_instructors, features["instructors"], axis=-1) +
                  tf.gather(effect_departments, features["departments"], axis=-1) +
                  self._intercept),
              scale=1.),
              reinterpreted_batch_ndims=1)
    ])

    # To enable tracking of the trainable variables via the created distribution,
    # we attach a reference to `self`. Since all TFP objects sub-class
    # `tf.Module`, this means that the following is possible:
    # LinearMixedEffectModel()(features_train).trainable_variables
    # ==> tuple of all tf.Variables created by LinearMixedEffectModel.
    model._to_track = self
    return model

lmm_jointdist = LinearMixedEffectModel()
# Conditioned on feature/predictors from the training data
lmm_train = lmm_jointdist(features_train)
lmm_train.trainable_variables
(<tf.Variable 'stddev_students:0' shape=() dtype=float32, numpy=0.0>,
 <tf.Variable 'stddev_instructors:0' shape=() dtype=float32, numpy=0.0>,
 <tf.Variable 'stddev_departments:0' shape=() dtype=float32, numpy=0.0>,
 <tf.Variable 'effect_service:0' shape=() dtype=float32, numpy=0.0>,
 <tf.Variable 'intercept:0' shape=() dtype=float32, numpy=0.0>)

كبرنامج رسومي احتمالي ، يمكننا أيضًا تصور بنية النموذج من حيث الرسم البياني الحسابي. يشفر هذا الرسم البياني تدفق البيانات عبر المتغيرات العشوائية في البرنامج ، مما يوضح علاقاتها من حيث نموذج رسومي (الأردن ، 2003).

كأداة إحصائية، ونحن قد ننظر إلى الرسم البياني من أجل رؤية أفضل، على سبيل المثال، أن intercept و effect_service هي مشروطة تعتمد نظرا ratings . قد يكون من الصعب رؤيته من الكود المصدري إذا كان البرنامج مكتوبًا بفئات ، ومراجع متصالبة عبر الوحدات ، و / أو إجراءات فرعية. كأداة الحسابية، ونحن قد تلاحظ أيضا المتغيرات الكامنة تتدفق في ratings متغير عبر tf.gather مكتب خدمات المشاريع. هذا قد يكون عنق الزجاجة على بعض مسرعات الأجهزة إذا الفهرسة Tensor الصورة غير مكلفة. تصور الرسم البياني يجعل هذا واضحًا بسهولة.

lmm_train.resolve_graph()
(('effect_students', ()),
 ('effect_instructors', ()),
 ('effect_departments', ()),
 ('x', ('effect_departments', 'effect_instructors', 'effect_students')))

تقدير المعلمة

نظرا البيانات، والهدف من الاستدلال هو لتتناسب مع النموذج الآثار الثابتة المنحدر \(\beta\)، اعتراض \(\alpha\)، والتباين المكونة المعلمة \(\sigma^2\). مبدأ الاحتمالية القصوى يضفي الطابع الرسمي على هذه المهمة على أنها

\[ \max_{\beta, \alpha, \sigma}~\log p(\mathbf{y}\mid \mathbf{X}, \mathbf{Z}; \beta, \alpha, \sigma) = \max_{\beta, \alpha, \sigma}~\log \int p(\eta; \sigma) ~p(\mathbf{y}\mid \mathbf{X}, \mathbf{Z}, \eta; \beta, \alpha)~d\eta. \]

في هذا البرنامج التعليمي ، نستخدم خوارزمية Monte Carlo EM لتعظيم هذه الكثافة الهامشية (Dempster et al. ، 1977 ؛ Wei and Tanner ، 1990). التأثيرات العشوائية ("E-step") ، ونقوم بإجراء نزول متدرج لتعظيم التوقع فيما يتعلق بالمعلمات ("M-step"):

  • بالنسبة للخطوة الإلكترونية ، قمنا بإعداد Hamiltonian Monte Carlo (HMC). يأخذ الحالة الحالية - الطالب والمدرس وتأثيرات القسم - ويعيد حالة جديدة. نقوم بتعيين الحالة الجديدة لمتغيرات TensorFlow ، والتي ستشير إلى حالة سلسلة HMC.

  • بالنسبة للخطوة M ، نستخدم العينة اللاحقة من HMC لحساب تقدير غير متحيز للاحتمال الهامشي حتى ثابت. ثم نطبق تدرجها فيما يتعلق بمعايير الفائدة. ينتج عن هذا خطوة نزول غير متحيزة على الاحتمال الهامشي. نقوم بتطبيقه باستخدام مُحسِّن Adam TensorFlow وتقليل السلبيات الهامشية.

target_log_prob_fn = lambda *x: lmm_train.log_prob(x + (labels_train,))
trainable_variables = lmm_train.trainable_variables
current_state = lmm_train.sample()[:-1]
# For debugging
target_log_prob_fn(*current_state)
<tf.Tensor: shape=(), dtype=float32, numpy=-528062.5>
# Set up E-step (MCMC).
hmc = tfp.mcmc.HamiltonianMonteCarlo(
    target_log_prob_fn=target_log_prob_fn,
    step_size=0.015,
    num_leapfrog_steps=3)
kernel_results = hmc.bootstrap_results(current_state)

@tf.function(autograph=False, jit_compile=True)
def one_e_step(current_state, kernel_results):
  next_state, next_kernel_results = hmc.one_step(
      current_state=current_state,
      previous_kernel_results=kernel_results)
  return next_state, next_kernel_results

optimizer = tf.optimizers.Adam(learning_rate=.01)

# Set up M-step (gradient descent).
@tf.function(autograph=False, jit_compile=True)
def one_m_step(current_state):
  with tf.GradientTape() as tape:
    loss = -target_log_prob_fn(*current_state)
  grads = tape.gradient(loss, trainable_variables)
  optimizer.apply_gradients(zip(grads, trainable_variables))
  return loss

نقوم بإجراء مرحلة إحماء ، والتي تدير سلسلة MCMC واحدة لعدد من التكرارات بحيث يمكن تهيئة التدريب ضمن الكتلة الاحتمالية اللاحقة. ثم نجري حلقة تدريبية. يدير بشكل مشترك الخطوات E و M ويسجل القيم أثناء التدريب.

num_warmup_iters = 1000
num_iters = 1500
num_accepted = 0
effect_students_samples = np.zeros([num_iters, num_students])
effect_instructors_samples = np.zeros([num_iters, num_instructors])
effect_departments_samples = np.zeros([num_iters, num_departments])
loss_history = np.zeros([num_iters])
# Run warm-up stage.
for t in range(num_warmup_iters):
  current_state, kernel_results = one_e_step(current_state, kernel_results)
  num_accepted += kernel_results.is_accepted.numpy()
  if t % 500 == 0 or t == num_warmup_iters - 1:
    print("Warm-Up Iteration: {:>3} Acceptance Rate: {:.3f}".format(
        t, num_accepted / (t + 1)))

num_accepted = 0  # reset acceptance rate counter

# Run training.
for t in range(num_iters):
  # run 5 MCMC iterations before every joint EM update
  for _ in range(5):
    current_state, kernel_results = one_e_step(current_state, kernel_results)
  loss = one_m_step(current_state)
  effect_students_samples[t, :] = current_state[0].numpy()
  effect_instructors_samples[t, :] = current_state[1].numpy()
  effect_departments_samples[t, :] = current_state[2].numpy()
  num_accepted += kernel_results.is_accepted.numpy()
  loss_history[t] = loss.numpy()
  if t % 500 == 0 or t == num_iters - 1:
    print("Iteration: {:>4} Acceptance Rate: {:.3f} Loss: {:.3f}".format(
        t, num_accepted / (t + 1), loss_history[t]))
Warm-Up Iteration:   0 Acceptance Rate: 1.000
Warm-Up Iteration: 500 Acceptance Rate: 0.754
Warm-Up Iteration: 999 Acceptance Rate: 0.707
Iteration:    0 Acceptance Rate: 1.000 Loss: 98220.266
Iteration:  500 Acceptance Rate: 0.703 Loss: 96003.969
Iteration: 1000 Acceptance Rate: 0.678 Loss: 95958.609
Iteration: 1499 Acceptance Rate: 0.685 Loss: 95921.891

يمكنك أيضا كتابة الودية للحلقة إلى tf.while_loop ، وخطوة التدريب في tf.scan أو tf.while_loop لأسرع الاستدلال. فمثلا:

@tf.function(autograph=False, jit_compile=True)
def run_k_e_steps(k, current_state, kernel_results):
  _, next_state, next_kernel_results = tf.while_loop(
      cond=lambda i, state, pkr: i < k,
      body=lambda i, state, pkr: (i+1, *one_e_step(state, pkr)),
      loop_vars=(tf.constant(0), current_state, kernel_results)
  )
  return next_state, next_kernel_results

أعلاه ، لم نقم بتشغيل الخوارزمية حتى تم اكتشاف عتبة التقارب. للتحقق مما إذا كان التدريب معقولًا ، نتحقق من أن وظيفة الخسارة تميل بالفعل إلى التقارب على التكرارات التدريبية.

plt.plot(loss_history)
plt.ylabel(r'Loss $-\log$ $p(y\mid\mathbf{x})$')
plt.xlabel('Iteration')
plt.show()

بي إن جي

نستخدم أيضًا مخطط التتبع ، والذي يُظهر مسار خوارزمية مونت كارلو لسلسلة ماركوف عبر أبعاد كامنة محددة. فيما يلي نرى أن تأثيرات المعلم المحددة تنتقل فعليًا بعيدًا عن حالتها الأولية واستكشاف مساحة الولاية. يشير مخطط التتبع أيضًا إلى أن التأثيرات تختلف عبر المدرسين ولكن بسلوك خلط مماثل.

for i in range(7):
  plt.plot(effect_instructors_samples[:, i])

plt.legend([i for i in range(7)], loc='lower right')
plt.ylabel('Instructor Effects')
plt.xlabel('Iteration')
plt.show()

بي إن جي

نقد

أعلاه ، قمنا بتركيب النموذج. نحن الآن ننظر في انتقاد مدى ملاءمته باستخدام البيانات ، مما يتيح لنا استكشاف النموذج وفهمه بشكل أفضل. أحد هذه الأساليب هو الرسم المتبقي ، الذي يرسم الفرق بين تنبؤات النموذج والحقيقة الأساسية لكل نقطة بيانات. إذا كان النموذج صحيحًا ، فيجب توزيع فرقهم بشكل قياسي ؛ أي انحرافات عن هذا النمط في المؤامرة تشير إلى عدم توافق النموذج.

نقوم ببناء المؤامرة المتبقية من خلال تشكيل التوزيع التنبئي اللاحق أولاً على التصنيفات ، والذي يحل محل التوزيع السابق للتأثيرات العشوائية ببيانات التدريب اللاحقة. على وجه الخصوص ، نقوم بتشغيل النموذج إلى الأمام ونعترض اعتماده على التأثيرات العشوائية السابقة بوسائلها اللاحقة المستنتجة.²

lmm_test = lmm_jointdist(features_test)

[
    effect_students_mean,
    effect_instructors_mean,
    effect_departments_mean,
] = [
     np.mean(x, axis=0).astype(np.float32) for x in [
       effect_students_samples,
       effect_instructors_samples,
       effect_departments_samples
       ]
]

# Get the posterior predictive distribution
(*posterior_conditionals, ratings_posterior), _ = lmm_test.sample_distributions(
    value=(
        effect_students_mean,
        effect_instructors_mean,
        effect_departments_mean,
))

ratings_prediction = ratings_posterior.mean()

عند الفحص البصري ، تبدو المخلفات قياسية إلى حد ما - موزعة بشكل طبيعي. ومع ذلك ، فإن الملاءمة ليست مثالية: هناك كتلة احتمالية أكبر في الذيول من التوزيع الطبيعي ، مما يشير إلى أن النموذج قد يحسن ملاءمته من خلال تخفيف افتراضاته الطبيعية.

على وجه الخصوص، على الرغم من أنه هو الأكثر شيوعا في استخدام التوزيع الطبيعي لتصنيفات نموذج في InstEval مجموعة البيانات، نظرة فاحصة على البيانات يكشف عن أن نسبة تقييم بالطبع هي في القيم ترتيبي حقيقة من 1 إلى 5. وهذا يشير إلى أننا يجب أن تستخدم توزيع ترتيبي ، أو حتى فئوي إذا كان لدينا بيانات كافية للتخلص من الترتيب النسبي. هذا تغيير من سطر واحد للنموذج أعلاه ؛ نفس كود الاستدلال قابل للتطبيق.

plt.title("Residuals for Predicted Ratings on Test Set")
plt.xlim(-4, 4)
plt.ylim(0, 800)
plt.hist(ratings_prediction - labels_test, 75)
plt.show()

بي إن جي

لاستكشاف كيفية قيام النموذج بعمل تنبؤات فردية ، نلقي نظرة على الرسم البياني للتأثيرات للطلاب والمعلمين والأقسام. يتيح لنا هذا فهم كيف تميل العناصر الفردية في متجه معالم نقطة البيانات إلى التأثير على النتيجة.

ليس من المستغرب أن نرى أدناه أن كل طالب عادة ما يكون له تأثير ضئيل على تقييم تقييم المعلم. ومن المثير للاهتمام ، أننا نرى أن القسم الذي ينتمي إليه المعلم له تأثير كبير.

plt.title("Histogram of Student Effects")
plt.hist(effect_students_mean, 75)
plt.show()

بي إن جي

plt.title("Histogram of Instructor Effects")
plt.hist(effect_instructors_mean, 75)
plt.show()

بي إن جي

plt.title("Histogram of Department Effects")
plt.hist(effect_departments_mean, 75)
plt.show()

بي إن جي

الحواشي

¹ تعد نماذج التأثير المختلط الخطية حالة خاصة حيث يمكننا حساب كثافتها الهامشية بشكل تحليلي. لأغراض هذا البرنامج التعليمي ، نوضح Monte Carlo EM ، والذي ينطبق بسهولة أكبر على الكثافات الهامشية غير التحليلية ، مثل ما إذا كان الاحتمال قد تم تمديده ليكون فئويًا بدلاً من عادي.

² من أجل التبسيط ، نشكل متوسط ​​التوزيع التنبئي باستخدام مسار أمامي واحد فقط للنموذج. يتم ذلك عن طريق التكييف على المتوسط ​​الخلفي وهو صالح لنماذج التأثيرات المختلطة الخطية. ومع ذلك ، هذا غير صالح بشكل عام: متوسط ​​التوزيع التنبئي اللاحق عادة ما يكون مستعصيًا على الحل ويتطلب أخذ المتوسط ​​التجريبي عبر ممرات أمامية متعددة للنموذج المعطى عينات لاحقة.

شكر وتقدير

وقد كتب هذا البرنامج التعليمي أصلا في إدوارد 1.0 ( مصدر ). نشكر جميع المساهمين في كتابة ومراجعة هذا الإصدار.

مراجع

  1. دوجلاس بيتس ومارتن ماتشلر وبن بولكر وستيف ووكر. تركيب النماذج الخطية ذات التأثيرات المختلطة باستخدام lme4. مجلة البرامج الإحصائية، 67 (1): 1-48، 2015.

  2. آرثر بي ديمبستر ، نان إم ليرد ، ودونالد ب.روبن. احتمالية قصوى من البيانات غير الكاملة عبر خوارزمية EM. مجلة الجمعية الإحصائية الملكية، سلسلة B (المنهجية)، 1-38، 1977.

  3. أندرو جيلمان وجنيفر هيل. تحليل البيانات باستخدام نماذج الانحدار والنماذج متعددة المستويات / الهرمية. مطبعة جامعة كامبريدج ، 2006.

  4. ديفيد إيه هارفيل. نهج الاحتمالية القصوى لتقدير مكون التباين والمشاكل ذات الصلة. مجلة الجمعية الإحصائية الأمريكية، 72 (358): 320-338، 1977.

  5. مايكل جوردان. مقدمة للنماذج الرسومية. التقرير الفني 2003.

  6. نان إم ليرد وجيمس وير. نماذج التأثيرات العشوائية للبيانات الطولية. القياسات الحيوية، 963-974، 1982.

  7. جريج وي ومارتن أ. تانر. تطبيق مونت كارلو لخوارزمية EM وخوارزميات زيادة بيانات الرجل الفقير. مجلة الجمعية الإحصائية الأمريكية، 699-704، 1990.