2017-02-18 8 views
1

Nach vielen Jahren von Stata weg ich zur Zeit Code bearbeite ich die immer wieder so etwas wie dies funktioniert:Neuen Variable min/max in Stata

egen min = min(x) 
egen max = max(x) 
generate xn = (x - min)/(max - min) 
drop min max 

Ich möchte diesen Code auf einer Linie zu reduzieren. Aber keine der beiden "natürlichen" Arten, die mir in den Sinn kommen, funktionieren.

gen x_index = (x - min(x))/(max(x)- min(x)) 
egen x_index = (x - min(x))/(max(x)- min(x)) 

Welche Teile der Stata Logik fehlt mir?

Antwort

2

Die Stata-Funktionen max() und min() erfordern zwei oder mehr Argumente und arbeiten zeilenweise (über Beobachtungen), wenn eine Variable als eines der Argumente angegeben wird. Dokumentiert bei z.B. help max(). Die egen Funktionen max() und min() können nur innerhalb von egen Anrufe verwendet werden. Sie könnten mit einzelnen Variablen angewendet werden, aber ihre Verwendung zur Berechnung einzelner Maxima oder Minima ist grob ineffizient, es sei denn, es ist ausnahmsweise notwendig, das einzelne Ergebnis in einer Variablen zu speichern. Dokumentiert mit Ausnahme der Warnungen unter help egen.

Keine Annäherung, die Sie in Betracht ziehen, funktioniert, ohne mehr Kreisverkehr zu werden. Betrachten

su x, meanonly 
gen x_index = (x - r(min))/(r(max)- r(min)) 

Unter bestimmten Umständen könnte es effizienter sein, um die Reichweite zu berechnen nur einmal:

su x, meanonly 
scalar range = r(max) - r(min) 
gen x_index = (x - r(min))/range 

In einem Programm, wäre es in der Regel besser, den skalaren einen temporären Namen zu geben.

Innerhalb egen Anrufe kann eine egen Funktion nur einmal aufgerufen werden.

+0

Danke, atm Ich bin mehr mit Lesbarkeit als Effizienz beschäftigt. Wäre es gleichwertig, wenn ich "su x, meanonly" durch "qui su x" ersetzen würde? – snoram

+0

Nein; das ist nicht gleichwertig. Dies lässt sich leicht aus "help summarize" ableiten. Zusammenfassen bedeutet mehr als nur zusammenfassen. –

+0

Ich meine Äquivalent ** für unseren Zweck hier ** r() danach zu nennen. – snoram