جدولة متغيرات متعددة مع بادئة مشتركة باستخدام ماكرو محلي
-
02-10-2019 - |
سؤال
لدي عدد من المتغيرات التي يبدأ اسمها بالبادئة indoor
. ما يأتي بعد indoor
ليس رقميًا (من شأنه أن يجعل كل شيء أكثر بساطة).
أود جدولة لكل من هذه المتغيرات.
الكود الخاص بي هو ما يلي:
local indoor indoor*
foreach i of local indoor {
tab `i' group, col freq exact chi2
}
المشكلة هي indoor
في ال foreach
يحل الأمر إلى indoor*
وليس إلى قائمة indoor
أسئلة ، كما كنت آمل. لهذا السبب ، tab
يتبع الأمر العديد من المتغيرات (يمكنه التعامل مع اثنين فقط) وهذا يؤدي إلى خطأ.
الإصلاح البسيط هو استبدال الأمر الأول بـ:
local indoor <full list of indoor questions>
ولكن هذا هو ما أود تجنبه ، وهو ما يجب أن أجد جميع أسماء هذه المتغيرات ثم لصقها في الكود. يبدو أن هناك حلًا أسرع لهذا ولكن لا يمكنني التفكير في أي.
المحلول
يمكنك القيام بذلك مع
foreach i of var `indoor' {
tab `i' group, col freq exact chi2
}
نصائح أخرى
الحيلة هي الاستخدام ds
أو unab
لإنشاء توسع Varlist قبل مطالبة STATA بحلق على القيم في foreach
عقدة.
إليك مثال لكل:
******************! BEGIN EXAMPLE
** THIS FIRST SECTION SIMPLY CREATES SOME FAKE DATA & INDOOR VARS **
clear
set obs 10000
local suffix `c(ALPHA)'
token `"`suffix'"'
while "`1'" != "" {
g indoor`1'`2'`3' = 1+int((5-1+1)*runiform())
lab var indoor`1'`2'`3' "Indoor Values for `1'`2'`3'"
mac shift 1
}
g group = rbinomial(1,.5)
lab var group "GROUP TYPE"
** NOW, YOU SHOULD HAVE A BUNCH OF FAKE INDOOR
**VARS WITH ALPHA, NOT NUMERIC SUFFIXES
desc indoor*
**استعمال ds
لإنشاء varlist الخاص بك ل foreach
عقدة:
ds indoor*
di "`r(varlist)'"
local indoorvars `r(varlist)'
local n 0
foreach i of local indoorvars {
** دعنا نقوم بتنظيف طاولاتك قليلاً مع بعض الرؤوس عبر display
local ++n
di in red "--------------------------------------------"
di in red "Table `n': `:var l `i'' by `:var l group'"
di in red "--------------------------------------------"
**لك tab
الجداول
tab `i' group, col freq chi2 exact nolog nokey
}
******************! END EXAMPLE
أو باستخدام unab
في حين أن:
******************! BEGIN EXAMPLE
unab indoorvars: indoor*
di "`indoorvars'"
local n 0
foreach i of local indoorvars {
local ++n
di in red "--------------------------------------------"
di in red "Table `n': `:var l `i'' by `:var l group'"
di in red "--------------------------------------------"
tab `i' group, col freq chi2 nokey //I turned off exact to speed things up
}
******************! END EXAMPLE
مزايا ds
تعال إلى اللعب إذا كنت ترغب في تحديد Vars الداخلي باستخدام قاعدة اختيار صعبة ، مثل اختيار Vars الداخلي بناءً على المعلومات في التسمية المتغيرة أو بعض الخصائص الأخرى.
هذا من شأنه أن يعمل. إنه متطابق تقريبًا للرمز في السؤال.
unab indoor : indoor*
foreach i of local indoor {
tab `i' group, col freq exact chi2
}
يحتوي هذا السؤال على جزأين:
1. كيفية تعيين أسماء متغيرة متعددة إلى ماكرو محلي
كما لاحظ آخرون ، فإن الخيار الواضح هنا هو استخدام الأوامر ds
و unab
:
ds indoor*
unab indoor : indoor*
2. كيفية أتمتة جدولة المتغيرات التي تشارك بادئة مشتركة
بالنسبة لهذا الجزء ، فإن بناء الحلقات الحلقة "الأبسط والأكثر" في سياق Stata هو في الواقع الشخص الذي اقترحه Vadim (والذي كان مخدرًا):
foreach var of varlist indoor* {
tab `var' group, col freq exact chi2
}
مما لا شك فيه ، يمكن للمرء أن يمزج بين النهجين ولكن في هذه الحالة يكون الأمر لا داعي له وغير فعال.
foreach v of varlist indoo* {
do sth with `v'
}