Introduktion till Stata: skapa och ändra variabler

detta är del sex av introduktion till Stata. Om du är ny på Stata rekommenderar vi starkt att du börjar från början.

Hoppa till innehållet efter den här videon

den här artikeln lär dig grunderna för att skapa nya variabler, ändra befintliga variabler och skapa etiketter.

generera och ersätt

de primära kommandona för att skapa och ändra variabler är generera (vanligtvis förkortad gen) och ersätt (som, liksom andra kommandon som kan förstöra information, inte har någon förkortning). gen skapar nya variabler; ersätt ändrar värdena för befintliga variabler. Deras kärnsyntax är identisk:

genvariabel = uttryck

eller

ersätt variabel = uttryck

där variabel är namnet på variabeln du vill skapa eller ändra, och uttryck är det matematiska uttrycket vars resultat du vill lägga in det. Uttryck kan vara så enkelt som ett enda nummer eller involvera alla slags komplicerade funktioner. Du kan utforska vilka funktioner som är tillgängliga genom att skriva hjälpfunktioner. Om uttrycket beror på ett saknat värde vid något tillfälle saknas resultatet. Vanligtvis är det precis vad du förväntar dig och vill ha.

det är särskilt viktigt att använda do-filer när du ändrar dina data, så börja med att skapa en do-fil som laddar den automatiska datamängden:

capture log stäng
log med vars.logga, ersätt
rensa alla
sysuse auto

priserna i den automatiska datamängden är i 1978 Dollar, så det kan vara användbart att konvertera dem till 2020 Dollar. För att göra det måste du multiplicera priserna med en konverteringsfaktor som är konsumentprisindex 2020 dividerat med konsumentprisindex 1978, eller cirka 4. Koden kommer att vara:

gen price2020 = Pris * 4

Lägg till den här raden i din do-fil, kör den och undersök resultaten med:

bläddra gör prispris2020

priserna är fortfarande generellt lägre än vad du skulle se hos en bilhandlare, men det beror förmodligen på att dagens bilar är mycket trevligare än 1978 bilar. Det här är ett bra exempel på hur du kontrollerar ditt arbete: jämför vad du fick med vad du förväntade dig, och om de inte matchar, se till att du vet varför!

Internt utförde Stata en slinga: den beräknade pris*4 för den första observationen och lagrade resultatet i price2020 för den första observationen, sedan beräknade pris*4 för den andra observationen och lagrade resultatet i price2020 för den andra observationen, och så vidare för alla observationer i datamängden. Du lär dig att sträcka detta en-observation-at-a-time paradigm i Data Wrangling i Stata, men uppgifter som bryter det (som beräkningsmedel) kräver ett annat tillvägagångssätt som vi kommer att prata om snart.

Antag att vi ville vara lite mer exakta och använda 4.14 som omvandlingsfaktor. Du kan bli frestad att försöka lägga till kod som ”fixar” price2020-variabeln (säg, multiplicera den med 4.14/4). Men det är enklare och renare att fixa koden som skapade den i första hand. Ändra:

gen price2020 = Pris*4

till:

gen price2020 = pris * 4.14

och kör do-filen igen. Eftersom din do-fil laddar originaldata från disken varje gång den körs kan den helt enkelt skapa price2020-variabeln som den borde vara.

med både pris och price2020 får du jämföra sina värden och kontrollera ditt arbete. Men om du bara vill arbeta med 2020-dollar och är säker på att du har formeln rätt kan du använda kommandot ersätt för att ändra den befintliga prisvariabeln istället för att skapa en ny:

ersätt pris = pris*4.14

kör den här versionen så får du meddelandet (74 verkliga ändringar gjorda). Med tanke på att datamängden har 74 observationer berättar detta att alla ändrades, som du förväntar dig. När du börjar inkludera if-förhållanden, hur många observationer som faktiskt ändrats kan vara mycket användbar information.

övning: Utanför USA mäts bränsleeffektiviteten ofta i liter per kilometer (Observera att eftersom bränslet som används är i täljaren är ett lågt antal bra). För att konvertera miles per gallon till liter per kilometer, multiplicera det ömsesidiga av mpg (1/mpg) med 2,35. Skapa en variabel som lagrar bränsleeffektiviteten för varje bil i liter per kilometer.

skapa variabler med If-villkor

Hoppa till innehållet efter den här videon

om ett gen-kommando har ett if-villkor, kommer den resulterande variabeln (och måste) fortfarande att finnas för alla observationer. Det kommer dock att tilldelas ett saknat värde för observationer där if-villkoret inte är sant. Om ett ersätt-kommando har ett if-villkor, kommer observationer där if-villkoret inte är sant att lämnas oförändrat. Detta gör att du kan ställa in variabler till olika värden för olika observationer.

Antag att du ville kollapsa fempunktsskalan för rep78-variabeln till en trepunktsskala. Lägg till följande kod i din do-fil för att göra det:

gen rep3 = 1 om rep78<3
ersätt rep3 = 2 om rep78==3
ersätt rep3 = 3 om rep78>& rep78<.

den första raden skapar den nya variabeln rep3, men ställer bara in den till en för fall där rep78 är mindre än tre. De andra saknas. Den andra raden ändrar några av dessa missningar till två, och den tredje ändrar fler av dem till tre. Kör do-filen, notera antalet observationer som ändrats av varje rad och jämför det med det totala antalet observationer i datamängden.

vad kommer värdet av rep3 att vara för observationer där rep78 saknas? Saknas, som det borde vara, för det var aldrig inställt på något annat. De fem observationerna där rep78 saknas var implicit eller uttryckligen uteslutna från alla tre kommandona, så de började med ett saknat värde för rep3 och ändrades aldrig. (Om du glömde att utesluta saknade värden från det sista kommandot skulle rep3 vara tre för bilar där rep78 saknas, ett alltför vanligt misstag. Kom ihåg att saknas är i huvudsak oändlighet.)

övning: Att kombinera de och två är vettigt eftersom det finns så få av dem, men det fanns inget särskilt behov av att kombinera fyror och femmor. Skapa en rep4-variabel som kombinerar ettor och tvåor och numrerar om de andra kategorierna i enlighet därmed (dvs. rep4 ska gå från en till fyra).

Recode

Hoppa till innehållet efter den här videon

kommandot recode ger dig ett alternativt sätt att skapa rep3. Den är utformad enbart för omkodning uppgifter och är mycket mindre flexibel än gen och ersätta. Men det är väldigt lätt att använda. Syntaxen är:

recode var (regel 1) (regel 2) (fler regler efter behov…), gen(newvar)

gen—alternativet i slutet krävs inte-om det inte finns där kommer den ursprungliga variabeln att ändras snarare än att skapa en ny variabel med de nya värdena. Du kan också ha recode arbete på en lista med variabler, omkodning dem alla på samma sätt.

kärnan i kommandot recode är en lista med regler, var och en inom parentes, som berättar hur en variabel ska kodas om. De tar formen (inputValue = outputValue). Inputvärdet kan vara ett enda nummer, en lista med siffror åtskilda av mellanslag eller ett antal siffror som anges med start/slut. Utdatavärdet kommer alltid att vara ett enda nummer. Allt som inte omfattas av en regel lämnas oförändrat, så du kan använda recode för att ändra bara några värden på en variabel eller helt omdefiniera det som vi gör här. Här är en recode-version av att konvertera rep78 till en trepunktsskala:

recode rep78 (1 2 = 1) (3 = 2) (4 5 = 3), gen (rep3b)

saknade värden krävs ingen speciell hantering: eftersom saknad inte listades i ingångsvärdena för någon regel ändras inte observationer med saknade värden.

övning: skapa rep4b, kombinera endast de och två som ovan, med hjälp av recode.

Indikatorvariabler

Hoppa till innehållet efter den här videon

När du skapar indikatorvariabler kan du dra nytta av det faktum att Stata behandlar sant som en och falskt som noll genom att ställa in den nya variabeln lika med ett villkor. Tänk på:

gen lowMPG = (mpg<20)

(parenteserna är valfria, men gör det lättare att läsa.) Detta skapar en indikatorvariabel som kallas lowMPG som är en (sann) för bilar där mpg är mindre än tjugo och noll (falsk) där mpg är större än eller lika med tjugo. För att se resultaten kör do-filen och skriv sedan bläddra gör mpg om lowMPG.

ingen bil har ett saknat värde för mpg, Men om man gjorde det skulle ovanstående kod tilldela det en noll för lowMPG som om det var känt att ha bra gas körsträcka. Lowmpg-variabeln bör saknas för sådana fall, vilket du kan göra med:

gen lowMPG = (mpg<20) om mpg<.

övning: Skapa en indikatorvariabel som identifierar bilar med bra reparationsposter (definierad som rep78 större än 3). Hur skulle din kod ändras om indikatorvariabeln behövs för att identifiera bilar som är kända för att ha bra reparationsposter?

strängvariabler

Hoppa till innehållet efter den här videon

gen och ersätt kommandon fungerar också med strängvariabler. Uttrycken på höger sida av likhetstecknet är inte matematiska, men de följer liknande regler. Strängvärden går alltid i citat, så om du ville lagra bokstaven x i en variabel som heter x skulle du säga gen x = ”x”. Stata skulle inte hitta detta förvirrande (även om du kanske) eftersom x i citat (”x”) betyder bokstaven x och x utan citat betyder variabeln x.

tillägg för strängar definieras som att sätta en sträng efter den andra, så” abc ” + ” DEF ” = ”abcdef”. Men det mesta arbetet med strängar görs av specialfunktioner som tar strängar som inmatning (antingen strängvärden eller variabler som innehåller strängar) och returnerar strängar som utmatning.

make-variabeln registrerar verkligen två bitar av information: namnet på företaget som producerade bilen och namnet på bilmodellen. Du kan enkelt extrahera företagsnamnet med funktionen word ():

gen company = word(make,1)

för att se resultaten, kör do-filen och skriv bläddra make company. Den första inmatningen eller argumentet för funktionen word() är strängen att agera på (i detta fall en variabel som innehåller strängar). Den andra är ett nummer som berättar vilket ord du vill ha. Funktionen bryter inmatningssträngen i ord baserat på de mellanslag som den innehåller och returnerar den du bad om, i det här fallet den första.

vi säger mycket mer om strängfunktioner i textdata (kommande), men om du är angelägen om att komma igång kan du göra en hel del med bara följande funktioner:

word() extraherar ett ord från en sträng
strpos() talar om för dig om en sträng innehåller en annan sträng, och i så fall dess position
substr() extraherar delar av en sträng
subinstr() ersätter en del av en sträng med något annat
längd() berättar hur lång en sträng är (hur många tecken Den innehåller)

skriv hjälp och sedan namnet på en funktion i Huvud Stata fönster för att lära sig hur det fungerar.

övning: skapa en modellvariabel som innehåller namnet på bilmodellen (dvs. resten av märket). Din kod måste kunna hantera modellnamn som är antingen ett eller två ord långa.

konvertera strängvariabler till numeriska variabler

Hoppa till innehållet efter den här videon

ibland skrivs en variabel som ska vara numerisk in i Stata som en sträng. Du kan fixa det med destring-kommandot, som konverterar en strängvariabel som innehåller siffror till en numerisk variabel. Syntaxen förstör bara variabeln, ersätt, där variabeln ska ersättas med namnet på variabeln (eller variablerna) som ska förstöras. Om strängvariabeln innehåller allt annat än siffror kan du lägga till force-alternativet för att berätta för Stata att konvertera det ändå, men observationer med alla icke-numeriska tecken får ett saknat värde. Observera att” icke-numeriska tecken ” inkluderar dollartecken och kommatecken!

i allmänhet, om du måste använda force-alternativet beror det på att Stata inte är säker på vad du gör är en bra ide, och du bör tänka noga innan du gör det. I det här fallet bör du undersöka de icke-numeriska tecknen för att se om det skulle vara meningsfullt att ta bort dem först (som dessa dollartecken och kommatecken) eller om variabeln inte är egentligen bara siffror trots allt.

den här datamängden har inga variabler som behöver förstöras, så låt oss göra en:

gen x = ”5”

notera hur citaten runt ”5” betyder att x är en strängvariabel som innehåller tecknet 5, inte en numerisk variabel som innehåller värdet 5. Bara för att göra saker komplicerade, låt oss ändra några av värdena på x till verklig text:

ersätt x = ”saknas” om främmande

försök nu att förstöra x:

förstöra x, ersätt

Stata kommer att vägra, eftersom vissa av värdena på x inte kan konverteras till siffror. Men de värden som inte kan konverteras är ”saknade” så det är helt lämpligt att konvertera dem till saknade värden. Så försök igen med force-alternativet:

destring x, ersätt force

Nu konverterar Stata x till en numerisk variabel, med några saknade värden.

Egen

Hoppa till innehållet efter den här videon

kommandot egen, kort för ”extended generate” ger dig tillgång till ett annat bibliotek med funktioner. Det är lite av en hodge-podge, men egen funktioner du använder mest beräkna sammanfattande statistik:

Name Description
min() Minimum value
max() Maximum value
mean() Mean
median() Median
sd() Standard Deviation
total() Total

These are examples of aggregate functions: they take multiple numbers as input and return a single number as output. De arbetar också över observationer, och kan därför inte enkelt göras med gen eftersom det fungerar en observation i taget. Syntaxen ser nästan identisk ut med gen:

egen variable = function ()

den stora skillnaden med egen är att du inte skriver ditt eget matematiska uttryck; du använder bara en funktion från biblioteket. Om du till exempel behövde ställa in en variabel till ett medelvärde dividerat med två, kunde du inte säga egen y = medelvärde(x)/2. Du skulle istället först köra egen y = mean (x) och sedan ersätta y = y/2.

en annan viktig skillnad är hur saknade värden hanteras. Minns att med gen, om någon del av ingången saknades skulle utgången saknas. Egen ignorerar emellertid helt enkelt saknade värden och beräknar resultatet med hjälp av tillgängliga data. Vanligtvis är det vad du vill, men du måste vara medveten om vad egen gör och vara säker på att det är vettigt för din speciella uppgift.

egen-funktionerna för beräkning av sammanfattningsstatistik kombineras mycket ofta med by för att beräkna sammanfattningsstatistik för grupper. Beräkna det genomsnittliga bilpriset för varje företag och se sedan resultaten med:

bysort company: egen meanPrice = mean (price)
tab company, sum (meanPrice)

Kom ihåg att bysort company: sorterar först data efter företag och kör sedan följande egen-kommando separat för varje företag.

nollorna för standardavvikelse återspeglar det faktum att varje bil som produceras av samma företag har samma värde av meanPrice. Det beror på att meanPrice beskriver företaget, inte bilen. Det är faktiskt definitionen av en variabel som beskriver en grupp: varje enhet inom samma grupp måste ha samma värde för variabeln.

Om vi bara hade velat se medelvärdet av priset för varje företag, kunde vi bara ha kört:

tab company, sum(price)

men efter att ha kört egen har vi nu medelvärdet i en variabel, tillgänglig för användning.

övning: skapa en variabel som innehåller medelvärdet för rep78 för varje företag. Undersök sedan frekvenserna för rep78 inom varje företag genom att skapa en tvåvägstabell med tab. Var noga med att inkludera saknade värden. Lincoln och Olds har samma medelvärde; hur bra tror du att detta sammanfattar distributionen av rep78 för de två företagen? Nästa överväga de saknade värdena: Antag att det faktiska värdet av rep78 för bilarna med saknade vales avslöjades. Vad skulle de behöva vara för att dessa medel inte ska förändras? Hur troligt är det?

etiketter

Hoppa till innehållet efter den här videon

bra etiketter gör dina data mycket lättare att förstå och arbeta med. Medan Stata har många typer av etiketter fokuserar vi på de vanligaste och mest användbara: variabla etiketter och värdeetiketter.

Variabla etiketter

Variabla etiketter förmedlar information om en variabel och kan ersätta långa variabelnamn. Denna datamängd har redan en bra uppsättning variabla etiketter, som du kan se i fönstret variabler. Den enda som är förvirrande är etiketten på främmande, så ändra den med kommandot label variabel. Syntaxen för att ställa in en variabel etikett är:

etikettvariabel variabelnamn ”etikett”

så skriv:

etikettvariabel utländsk ”bil Ursprung”

titta på variablerna igen för att se resultaten.

Värdeetiketter

Värdeetiketter används med kategoriska variabler för att berätta vad kategorierna betyder. Vi har sett en i aktion med den utländska variabeln: det var värdeetiketterna som berättade för oss att en 0 betyder ”inhemsk” och en 1 betyder ”utländsk.”

Låt oss utforska värdeetiketter genom att märka värdena för rep3, den nya variabeln vi kodade om för att kollapsa rep78 från en fempunktsskala till en trepunktsskala. Värdeetiketter är en mappning från en uppsättning heltal till en uppsättning textbeskrivningar, så det första steget är att definiera kartan. För att göra det, använd kommandot label define:

label define mapName value1 ”label1” value2 ”label2″…

således:

etikett definiera replabel 1″ Dålig ”2” Genomsnittlig ”3”bra”

detta skapar en mappning som heter replabel men tillämpar den inte på någonting. Innan det gör något användbart måste du berätta för Stata att märka värdena för rep-variabeln med hjälp av replabel-mappningen som du just definierat. Syntaxen är:

etikettvärden variabel karta

och därmed:

etikettvärden rep3 replabel

för att se resultaten, kör:

lista gör rep3

När en karta har definierats kan du tillämpa den på valfritt antal variabler: ersätt bara den enskilda variabeln i kommandot etikettvärden ovan med en lista med variabler. Anta att du arbetar med undersökningsdata och dina variabler inkluderar svarandens kön, svarandens makas kön och könen för alla svarandens barn. Du kan definiera bara en karta som heter kön och sedan använda den för att märka värdena för alla könsvariabler.

tre kommandon för hantering av värdeetiketter: label dir ger dig en lista över alla definierade etiketter och etikettlistan berättar vad de betyder. Kommandot beskriv berättar namnet på värdeetiketterna som är associerade med varje variabel (bland många andra användbara saker).

övning: Skapa värdeetiketter för rep4 och tillämpa dem. Känn dig fri att bestämma hur du ska beskriva nivåerna.

etiketter via Recode

När du använder recode för att skapa en ny variabel skapar Stata automatiskt en variabel etikett för den (”RECODE of …”). Du kan också definiera värdeetiketter för det genom att sätta önskad etikett för varje värde i slutet av regeln som definierar det. Skapa ännu en version av rep3, den här gången med etiketter direkt från skapandet, med:

recode rep78 (1 2 = 1 ”dåligt”) (3 = 2 ”genomsnitt”) (4 5 = 3 ”bra”), gen(rep3c)

övning: Skapa en rep4c med recode, ställa in värdeetiketter för den.

denna do-fil ändrar datamängden den använder, så den bör spara den nya versionen. Kom ihåg att aldrig spara din produktion över din inmatning, så spara inte de nya data som auto. Om du gjorde det kunde du inte köra den här do-filen igen: den skulle krascha när den försökte skapa price2020 eftersom den variabeln redan fanns i den modifierade datamängden. Spara istället data som autoV2, som i ”version 2 av bildatasatsen.”

spara autoV2, ersätt

stäng slutligen loggen:

logga stäng

detta leder oss till slutet av introduktionen till Stata. Vi hoppas att det har varit till hjälp för dig. För att lära dig mer, överväg att läsa Data som strider i Stata eller det andra innehållet i SSCC: s statistiska Datakunskapsbas.

senast reviderad: 5/27/2020

Lämna ett svar

Din e-postadress kommer inte publiceras.