在 Stata 中用循环重新编码多个变量

Recoding multiple variables with loop in Stata

我有 13 个虚拟变量,它们共享一个通用名称(由于 space 原因,没有包括所有 13 个)

describe Q23*

Variable      Storage   Display    Value
    name         type    format    label      Variable label
Q23Agricultur~k str5    %9s                   Q23: Agriculture 
Q23Miningandq~g str5    %9s                   Q23: Mining
Q23Trade        str5    %9s                   Q23: Trade
Q23Teaching     str5    %9s                   Q23: Teaching
Q23Healthrela~k str5    %9s                   Q23: Health related work
Q23Transport    str5    %9s                   Q23: Transport
Q23Repairing    str5    %9s                   Q23: Repairing
Q23Construction str5    %9s                   Q23: Construction
Q23Manufactur~g str5    %9s                   Q23: Manufacturing
Q23Domesticwo~e str5    %9s                   Q23: Domestic work 

它们都是具有 TRUE/FALSE 值的虚拟变量,因此我想将它们编码为分类变量。因为他们有相似的名字,我想这样就可以了

foreach x of varlist Q23* {
    forvalues i = 1/13{
    encode `x', gen(sector`i')
    }
}

然而它所做的是生成13个sector变量,名称从1到13,但全部对应农业,其余none变量。

describe sector*

Variable      Storage   Display    Value
    name         type    format    label      Variable label
--------------------------------------------------------------------------------------------------
sector1         long    %8.0g      sector1    Q23: Agriculture and livestock
sector2         long    %8.0g      sector2    Q23: Agriculture and livestock
sector3         long    %8.0g      sector3    Q23: Agriculture and livestock
sector4         long    %8.0g      sector4    Q23: Agriculture and livestock
sector5         long    %8.0g      sector5    Q23: Agriculture and livestock
sector6         long    %8.0g      sector6    Q23: Agriculture and livestock
sector7         long    %8.0g      sector7    Q23: Agriculture and livestock
sector8         long    %8.0g      sector8    Q23: Agriculture and livestock
sector9         long    %8.0g      sector9    Q23: Agriculture and livestock
sector10        long    %8.0g      sector10   Q23: Agriculture and livestock
sector11        long    %8.0g      sector11   Q23: Agriculture and livestock
sector12        long    %8.0g      sector12   Q23: Agriculture and livestock
sector13        long    %8.0g      sector13   Q23: Agriculture and livestock

我做错了什么?为什么循环不起作用?

谢谢!

如果没有一小段数据作为可重现的示例(正如 ThelceBear 在他们的评论中提到的),很难验证您在这里做错了什么,但有两点:

  1. 语言 'encoding dummy variables into categorical variables' 在这种情况下(或我能想到的任何情况下)并没有真正意义。虚拟变量只是分类变量的一个特例,其中类别数 = 2。如果您从变量中的 2 个类别开始,我看不出在没有一些额外数据的情况下如何将其转换为 2 个以上的类别。尽管如此,这更像是一个语义点——我想你的意思是你想把你的字符串变量编码成数字变量(基于你对 encode 的使用)。

  2. 您不需要内部循环。目前,您的代码在外循环的第一次迭代中将 sector* 变量设为 1-13,然后在下一次迭代中替换这些变量,依此类推,直到外循环完成。以下代码可以帮助您解决此问题:

local i = 1
foreach x of varlist Q23* {
  encode `x', gen(sector`i')
  local i = `i' + 1
}

这不是一个完整的答案,但已经发布了一个很好的答案,这个额外的 material 太尴尬了,不适合发表评论。

对于值为 "TRUE""FALSE" 的字符串变量,有一个直接的解决方案:

local i = 0 
foreach v of var Q24* {
    local ++i 
    gen sector`i' = `v' == "TRUE" 
    label var sector`i' "`: var label `v''" 
}  
    

如果 "FALSE" 以外的某些值是可能的,您也需要捕获它,除非您很高兴它会映射到 0。