我有一组变量。我想将这个集合('y')中的每个变量转换如下:y'=(y-min(y))(max(y)-min(y))。也就是说,对于每个变量的每次观察,我想减去该变量的最小值,然后将结果除以该变量的最大值和最小值之间的差。
我想通过一个循环来实现这一点,使用foreach,但如上编码(使用min()andmax()函数)会产生错误消息。有没有其他选择?还是必须手动完成?
我有一组变量。我想将这个集合('y')中的每个变量转换如下:y'=(y-min(y))(max(y)-min(y))。也就是说,对于每个变量的每次观察,我想减去该变量的最小值,然后将结果除以该变量的最大值和最小值之间的差。
我想通过一个循环来实现这一点,使用foreach,但如上编码(使用min()andmax()函数)会产生错误消息。有没有其他选择?还是必须手动完成?
您应该能够调整下面的示例。该命令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选项确实产生最小值和最大值。