使用“foreach”转换变量

Transforming variables using ‘foreach’

我有一组变量。我想按如下方式转换此集合 (‘y’) 中的每个变量:y’ = (y-min(y))(max(y)-min(y))。也就是说,对于每个变量的每次观察,我想减去该变量的最小值,然后将结果除以该变量的最大值和最小值之间的差值。

我想使用 foreach 通过循环实现此功能,但如上编码(使用 min()max() 函数)会产生一条错误消息。有没有其他选择?还是必须手动完成?

您应该能够适应下面的示例。命令 summarize 将公式中需要的值存储在返回的 r() 值中。

sysuse auto

local vars price mpg weight length 

foreach var of local vars {
    summarize `var'
    replace `var' = (`var' - r(min)) / (r(max) - r(min))
}

问题中没有数据示例,也没有任何变量名称的指示。这是一个示例,您可以 运行.

sysuse auto, clear

ds, has(type numeric)

foreach v in `r(varlist)' {
    su `v', meanonly
    gen `v'_scaled = (`v' - r(min)) / (r(max) - r(min))
}

su *scaled

    Variable |        Obs        Mean    Std. Dev.       Min        Max
-------------+---------------------------------------------------------
price_scaled |         74    .2278444    .2338086          0          1
  mpg_scaled |         74    .3205965    .1995001          0          1
rep78_scaled |         69    .6014493    .2474831          0          1
headroom_s~d |         74    .4266409    .2417128          0          1
trunk_scaled |         74    .4864865    .2376336          0          1
-------------+---------------------------------------------------------
weight_sca~d |         74    .4089154    .2523356          0          1
length_sca~d |         74     .504752    .2446851          0          1
 turn_scaled |         74    .4324324    .2199677          0          1
displaceme~d |         74    .3418997    .2654255          0          1
gear_ratio~d |         74    .4852146    .2684042          0          1
-------------+---------------------------------------------------------
foreign_sc~d |         74    .2972973    .4601885          0          1

Stata 中的函数 min()max() 需要两个或多个参数,并且在任何情况下都是按行操作的。它们不会产生变量的最小值和最大值。您可以使用 egen 但循环的直接路由和调用 summarize 更可取。请注意,尽管名称如此,meanonly 选项确实会产生最小值和最大值。