Strmatch

Fragen zu Stata Syntax und Do-Files.

Strmatch

Beitragvon Julia_lisa » Mi 28. Aug 2013, 16:15

Liebe alle,

Ich habe ein ganz doofes Problem, an dem ich seit Tagen sitze und einfach nicht weiter komme.

Und zwar möchte ich gerne sehen, wie häufig bestimmte Antwortgründe von Befragten genannt wurden. Die Gründe wurden in einer STRING Variable erfasst. Dabei kommt es auch vor, dass in einem Feld mehrere Gründe angegeben wurden.

Jetzt war meine Lösung folgende:

Ich hätte für jeden einzelnen Grund eine Dummy Variable erstellt und diese dann per strmatch aufgefüllt. Hier die dazugehörige Syntax:

gen Beispielgrund 1=0
replace `var'Beispielgrund1= 1 if strmatch(lower(`var'GrndeANR),"*Beispielgrund1*")
replace `var'Beispielgrund1= 1 if strmatch(lower(`var'GrndeANR),"*Beispielgrund1*" | "*Beispielgrund1andereformulierung*")

das führt es mir dann auch aus, allerdings kommt immer!! 0 real changes made --> ich kann das gar nicht verstehen, weil die Formulierungen, die ich verwende, original aus dem Datensatz entnommen sind.

Ich verzweifle bald, kann mir irgendjemand sagen woran das liegt bzw. irgendwie helfen?

Ich wäre so unglaublich dannkbar :)!!

Alles liebe,

Julis
Julia_lisa
 
Beiträge: 12
Registriert: Mi 28. Aug 2013, 16:07
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Strmatch

Beitragvon daniel » Mi 28. Aug 2013, 16:38

Es wäre günstiger ein replizierbares Beispiel zu erstellen (add-ons-und-ado-files-f20/beispieldatensatze-erzeugen-t232.html).

Deine Beschreibung ernst nehmend (was vermutlich unsinnig ist), kann

if strmatch(lower(`var'GrndeANR),"*Beispielgrund1*")


niemals zu einem Treffer führen, da `var'GrndeANR nach der Transformation mittels -lower()- Funktion nur Kleinbuchstaben enthält, also in keinem Fall ein großes B, wie in *Beispielgrund1*. Ich vermute, das Problem liegt an anderer Stelle, aber es verdeutlicht so wundervoll, wesshalb es meist eher ungünstig ist Pseudo-Probleme zu schildern, statt einfach ein replizierbares Beispiel zu posten.

Die erste und dritte Zeiel Deines codes sind illegal, bzw. führen zu falschen Ergebnissen, da Beispielgrund 1 aufgrund des Leerzeichens kein gültiger Variablenname ist und mit der Konstruktion

if strmatch(lower(`var'GrndeANR),"*Beispielgrund1*" | "*Beispielgrund1andereformulierung*")


wohl eher

Code: Alles auswählen
if strmatch(lower(`var'GrndeANR),"*Beispielgrund1*") | strmatch(lower(`var'GrndeANR)"*Beispielgrund1andereformulierung*")


gemeint ist.

Ob -strmatch- hier überhaupt der geeignete Ansatz ist, vermag ich nicht zu beurteilen.
Stata is an invented word, not an acronym, and should not appear with all letters capitalized: please write “Stata”, not “STATA”.
daniel
 
Beiträge: 1060
Registriert: Sa 1. Okt 2011, 17:20
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Strmatch

Beitragvon Hannes_K » Fr 30. Aug 2013, 02:22

Hallo zusammen,

ist es möglich Variablen- und Wertelabel für Strings zu vergeben? Und wenn ja wie?

LG, Hannes
Hannes_K
 
Beiträge: 1
Registriert: Fr 30. Aug 2013, 02:19
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Strmatch

Beitragvon daniel » Fr 30. Aug 2013, 13:02

Das hat mit dem Thema des threads zwar nicht wirklich was zu tun, aber ja und nein. Variablen label kann man jeder Variable hanhängen. Wertelabels für string Variablen sind nach Ansich von StataCorp unsinnig (ich schließe mich an, denn Text einen beschreibenden Text anzuhängen wirkt konfus) und daher nicht erlaubt.

Für weitere Infos

Code: Alles auswählen
h label
Stata is an invented word, not an acronym, and should not appear with all letters capitalized: please write “Stata”, not “STATA”.
daniel
 
Beiträge: 1060
Registriert: Sa 1. Okt 2011, 17:20
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Strmatch

Beitragvon Julia_lisa » Fr 30. Aug 2013, 16:02

Lieber Daniel,

Danke!! Sorry für meine fehlerhafte Syntax (hätte da nach dem Eintippen einfach nochmal draufschauen sollen!), es lag tatsächlich an der Groß/Kleinschreibung!! Dass ich da selber nicht draufgekommen bin...vielen lieben Dank!!

Vielleicht kannst du mir ja noch einmal helfen (ich durchsteige das mit dem Beispieldatensatz noch nicht so ganz, deshalb hier noch einmal -die nun hoffentlich richtige- Syntax):

Für jeden einzelnen Grund habe ich nun eine Dummy Variable erstellt mit:

gen Beispielgrund1=0
replace `var'Beispielgrund1= 1 if strmatch(lower(`var'Grnde),"*beispielgrund1*") | strmatch(lower(`var'GrndeANR),"*beispielgrund1andereformulierung*")

das habe ich für jeden der einzelen Gründe gemacht. Abschließend wollte ich dann noch eine gemeinsame Variable zur Übersicht erstellen mit:

gen G=0
replace G=1 if Beispielgrund1 ==1
replace G=2 if Beispielgrund2 ==1
replace G=3 if Beispielgrund3==1
...

Da aber die Befragten oft mehrere Gründe genannt haben und diese alle in der originalen String stehen, zeigt es mir bei "G", dann nicht mehr die tatsächlichen Häufigkeiten an, sondern es fehlen dabei immer die Doppelnennungen.

Gibt es eine Syntax um damit irgendwie umnzugehen? Vielleicht irgendwie so in die Richtung:

gen G=0
replace G=1 if Beispielgrund1 ==1 unabhängig von den anderen Ausprägungen der Originalvariable ((`var'Grnde)??

Entschuldigung für das Durcheinander & LG,

Julia
Julia_lisa
 
Beiträge: 12
Registriert: Mi 28. Aug 2013, 16:07
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Strmatch

Beitragvon daniel » Fr 30. Aug 2013, 16:26

Ohne Beispiel, verstehe ich nicht wirklich, was genau das Problem ist. Aber ich hätte da ohnehin noch Fragen.

replace `var'Beispielgrund1= 1 [...]


Wozu ist das local var vor Beispielgrund (und den anderen Variablen)?

Abschließend wollte ich dann noch eine gemeinsame Variable zur Übersicht erstellen


Was genau soll da drin stehen, bzw. was genau soll da die Information sein?

replace G=1 if Beispielgrund1 ==1 unabhängig von den anderen Ausprägungen der Originalvariable ((`var'Grnde)??


ist exakt das gleiche, wie

replace G=1 if Beispielgrund1 ==1


Wie kommst Du darauf, dass es nicht so sein sollte?

Zum Beispieldatenstaz. Du kannst (a) Deinen Datensatz oder einen Auszug daraus anhängen, falls das aus rechtlichen Gründen kein Problem ist, oder (b) per Hand einen Beispieldatensatz aufschrieben. Letzteres würde in etwa so aussehen

Code: Alles auswählen
clear
inp str6 foo
"foobar"
"foo bar"
end


Bei (a) hilft Dir mein verlinktes ado, das genau so einen code im Stata resultswindow erzeugt, den Du dann hierher kopieren kannst.
Stata is an invented word, not an acronym, and should not appear with all letters capitalized: please write “Stata”, not “STATA”.
daniel
 
Beiträge: 1060
Registriert: Sa 1. Okt 2011, 17:20
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Strmatch

Beitragvon Julia_lisa » Fr 30. Aug 2013, 16:52

Lieber Daniel,

Oh mein Gott, ich bin dir ja so dankbar :)!!! vielen lieben Dank, dass du darauf reagierst :)!!

Ich habe einen Beispieldatensatz erstellt (hoffe, dass ich ds richtig gemacht habe) und hänge ihn samt Syntax gleich mal mit an. Das Problem ist, dass die Anzahl der Grundnennungen in G letztendlich nicht mehr mit den einzenen (tatsächlichen Nennungen übereinstimmt), ich glaube weil sie zum teil in der selben Zelle der Ursprungsvariable geführt werden. Ich hoffe das wird aus dem Datensatz ersichtlich, wenn nicht. versuche ich es einfach nochmal besser zu machen!!

sehr vielen lieben Dank & LG,

Julia

... Da es mir nicht erlaubt, den DO-File auch mit hochzuladen, hier die dazugehörige Syntax:

gen Hunger = 0
gen Angst = 0
gen Langeweile = 0

replace Hunger = 1 if strmatch(lower(`var'Grund),"*hunger*") | strmatch(lower(`var'Grund),"*hungrig*")
replace Angst = 1 if strmatch(lower(`var'Grund),"*angst*")
replace Langeweile = 1 if strmatch(lower(`var'Grund), "*langew*")


gen G=0
replace G=1 if Hunger==1
replace G=2 if Angst==1
replace G=3 if Langeweile==1

tab G
tab Hunger
tab Angst
tab Langeweile
Dateianhänge
Beispielgrund.dta
(1.6 KiB) 233-mal heruntergeladen
Julia_lisa
 
Beiträge: 12
Registriert: Mi 28. Aug 2013, 16:07
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Strmatch

Beitragvon daniel » Fr 30. Aug 2013, 18:12

Ich schätze Du hast da einen Denkfehler. Mit der Originalvariable hat das (natürlich) gar nichts zu tun. Mit den Doppelnennungen natürlich schon.

Das Ergebnis von G ist -- wie nicht anders zu erwarten -- genau das, was Du generierst. Ich verstehe noch nicht, was genau G anzeigen soll.

die Anzahl der Grundnennungen


deutet einfach auf eine Summe der Variablen Hunger, Angst und Langeweile hin. Also

Code: Alles auswählen
g G2 = Hunger + Angst + Langeweile


Wenn Du die verschiedenen Kombinationen der Nennungen auseinanderhalten willst, kannst Du mit -egen-s -group()- Funktion arbeiten

Code: Alles auswählen
egen G3 = group(Hunger Angst Langeweile) ,l
Stata is an invented word, not an acronym, and should not appear with all letters capitalized: please write “Stata”, not “STATA”.
daniel
 
Beiträge: 1060
Registriert: Sa 1. Okt 2011, 17:20
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Strmatch

Beitragvon Julia_lisa » Fr 30. Aug 2013, 18:28

Lieber Daniel,

Danke schön!! Oh, ja stimmt.

Das "Ziel" ist folgender Output (siehe Anhang) (bloß mit der richtigen Anzahl). Vielleicht kriege ich den ja auch irgendwie anders...ich weiss nur einfach (noch) nicht wie :roll:


VLG,

Julia
Dateianhänge
Dok3.pdf
(27.75 KiB) 239-mal heruntergeladen
Julia_lisa
 
Beiträge: 12
Registriert: Mi 28. Aug 2013, 16:07
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Strmatch

Beitragvon Julia_lisa » Fr 30. Aug 2013, 20:51

Weil ich es gerade zwei Stunden (vergeblich) versucht habe: Ist das denn eingentlich überhaupt irgendwie möglich/erzeugbar oder sollte ich es mit einem ganz anderen Befehl versuchen?

sehr viel Dank & LG!
Julia_lisa
 
Beiträge: 12
Registriert: Mi 28. Aug 2013, 16:07
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Nächste

Zurück zu Stata Syntax

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast