0

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

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

4

2 回答 2

3

您应该能够调整下面的示例。该命令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))
}
于 2021-10-28T12:28:37.627 回答
1

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

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选项确实产生最小值和最大值。

于 2021-10-28T12:30:06.237 回答