我在 Stata 中有两个变量,它们是字符串(
MAIDCW1
和strboth
)。
我想检查每个观察结果
MAIDCW1
的值是否存在于整个strboth
中的某个位置。如果变量中存在这个值,我想将变量TreatmentFinal
设置为1,否则设置为0。
我尝试了以下代码变体,但总是收到错误代码“无效语法”:
**Variant 1:**
gen TreatmentFinal = 0
forvalues i = 1 / _N {
quietly count if strboth == MAIDCW1
if r(N) > 0 {
replace TreatmentFinal = 1 in `i'
} else {
replace TreatmentFinal = 0 in `i'
}
}
**Variant 2:**
gen TreatmentFinal = 0
forvalues i = 1 / _N {
qui gen match = cond(index(strboth, MAIDCW1[`i']) > 0, 1, 0)
replace TreatmentFinal = match in `i'
drop match
}
我还尝试首先将
strboth
和 MAIDCW1
格式化为字符串,但这不会改变结果,我仍然收到错误代码“无效语法”。
附录:
1.) 我使用 Excel 数据集并将市场 ID 随机分配给治疗组 (1) 和对照组 (0)。因此,变量 Treatment 要么是 1,要么是 0。
2.) 我将市场 ID(例如 046914YBB)和治疗合并为 strboth(例如 046914YBB1)。
3.) 现在,我查看一个不同的列,其中有多个相同市场 ID 的条目(针对不同的日历周),并向所有条目添加“1”,以便将其与 strboth 进行比较,这将表明它是否属于治疗组(因为 strboth 中的市场 ID 条目末尾也有“1”)或对照组(如果该条目末尾有“0”)。该变量就是 MAIDCW1。具有相同标记 ID 的条目应始终位于同一组(治疗组或对照组)。
4.) 然后,对于 MAIDCW1 的所有条目,我检查 strboth 中是否也存在该值,以便为不同日历周的所有市场 ID 定义它们是否属于治疗组或对照组 (TreamtentFinal)。 -> 这里出现了 Nick 代码的问题:不同日历周的市场 ID 的相同条目(MAIDCW1 中的条目)在 TreatmentFinal 中收到不同的值(0 或 1),即使它们都应该具有相同的值。
这是完整的代码,包括尼克的建议:
clear
import excel "Example.xlsx", sheet("Example") firstrow
set seed 123
bysort MarktName: gen double rand1=rnormal() if _n==1
egen max1=max(rand1), by(MarktName)
replace rand1=max1
bysort AbteilungName: gen double rand2=rnormal() if _n==1
egen max2=max(rand2), by(AbteilungName)
replace rand2=max2
sort rand1 rand2
// Randomization pattern
gen Randomisierung =
“111000011100001110000111100011110001111000011100001110000111100011”
// Assignment to treatment (1) or control group (0)
gen Treatment = substr(Randomisierung, _n, 1)
drop Randomisierung
//Here the relevant part begins:
gen TreatmentFinal = 0
gen strboth = MAID + Treatment
gen long obsno = _n
egen long group = group(strboth)
su group, meanonly
local G = r(max)
quietly forval g = 1/`G' {
su obsno if group == `g', meanonly
count if strboth[r(min)] == MAIDCW1
if r(N) > 0 replace TreatmentFinal = 1 if group == `g'
}
这可能有用。我怀疑这是不是很好的 Stata 风格,其他人可能会想到更好的方法,但让我们让您更接近可行的方法。有些人会认为这是一个问题
merge
。
我们应该做的是循环
strboth
的不同值,而不是对具有相同值的每个观察值重复比较。
gen TreatmentFinal = 0
gen long obsno = _n
egen long group = group(strboth)
su group, meanonly
local G = r(max)
quietly forval g = 1/`G' {
su obsno if group == `g', meanonly
count if strboth[r(min)] == MAIDCW1
if r(N) > 0 replace TreatmentFinal = 1 if group == `g'
}
代码中的错误:
forvalues
不会即时评估 _N
。
循环观察结果本身并不意味着每次循环都关注特定的观察结果。
字符串的显示格式与此问题无关。
其他要点:
没必要
replace
0加0。
cond(index(strboth, MAIDCW1[`i']) > 0, 1, 0)
相当于
index(strboth, MAIDCW1[`i']) > 0`