Stata:如何检查一个变量的值是否存在于另一个变量的列中?

问题描述 投票:0回答:1

我在 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' 
}
variables stata check-constraints
1个回答
0
投票

这可能有用。我怀疑这是不是很好的 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' 
}

代码中的错误:

  1. forvalues
    不会即时评估
    _N

  2. 循环观察结果本身并不意味着每次循环都关注特定的观察结果。

  3. 字符串的显示格式与此问题无关。

其他要点:

  1. 没必要

    replace
    0加0。

cond(index(strboth, MAIDCW1[`i']) > 0, 1, 0)

相当于

index(strboth, MAIDCW1[`i']) > 0`
© www.soinside.com 2019 - 2024. All rights reserved.