Seite 1 von 1

Mata Funktion ausführen

BeitragVerfasst: Mo 27. Jan 2014, 16:39
von str3ber
Hallo, ich würde gerne diese MataFunktion ausführen.
Dazu lade ich den code zuerst in ein dofile und compile ihn durch run
meine zu vergleichenden Variablen heißen {neu,alt} wie lade ich diese in das programm?


Code: Alles auswählen
mata:
/******************************************************************************
   Terminology Note
   key: string to measure each observation against
   trymatch: one of many potential matches to be measured against the key
   TRIES: Nx1 vector of all "trymatch"s
******************************************************************************/

void matalev1var(string scalar varname, string scalar key,
                 string scalar newvar , string scalar touse) {

   TRIES = st_sdata(. , varname , touse) // Nx1 string vector with potential matches
   dist = J(rows(TRIES),1,.)             // Nx1 real vector to hold lev distances to each match

   for (t = 1 ; t <= rows(TRIES) ; t++) {
      dist[t] = matalev(key,TRIES[t,1]) // save distance
    }
    st_store(. , st_addvar("int", newvar) , touse , dist)
}

void matalev2var(string scalar var1   , string scalar var2,
                 string scalar newvar , string scalar touse) {

    KEYS  = st_sdata(. , var1 , touse)
   TRIES = st_sdata(. , var2 , touse) // Nx1 string vector with potential matches
   dist = J(rows(TRIES),1,.)          // Nx1 real vector to hold lev distances to each match
   
   for (t = 1 ; t <= rows(TRIES) ; t++) {
       dist[t] = matalev(KEYS[t,1],TRIES[t,1])
    }
    st_store(. , st_addvar("int", newvar) , touse , dist)
}

real scalar matalev(string scalar key, string scalar trymatch) {
    keylength = strlen(key)         
   trylength = strlen(trymatch)     
    // declare distance matrix   
   D = J(keylength , trylength , .)
    // Add starting penalties in first column
    D = ((1::keylength) , D)
    // Add starting penalties in first row
    D = ((0..trylength) \ D)    
    // add penalty for each operation required to reconcile the two strings
    for (i = 1 ; i <= keylength ; i++ ) {
        for (j = 1 ; j <= trylength ; j++ ) {
            if (substr(key, i, 1) == substr(trymatch, j, 1)) {
                D[i+1,j+1] = D[i,j]
            }
            else {         //    (deletion   , insertion  , substition)
                D[i+1,j+1] = min((D[i,j+1]+1 , D[i+1,j]+1 , D[i,j]+1  ))   
            }
        }
    }
    return(D[i,j])
    }
end

Re: Mata Funktion ausführen

BeitragVerfasst: Di 28. Jan 2014, 12:24
von daniel
Ich denke, Mata schießt hier etwas über das Ziel hinaus, aber

Code: Alles auswählen
. mata : myfcn(args)


führt die Mata Funktion myfunc() mit den argumenten args aus.

Re: Mata Funktion ausführen

BeitragVerfasst: Di 28. Jan 2014, 17:00
von str3ber
Okay das klappt schonmal zumindest wenn ich einen string selbst einsetzte

mata : matalev("aba","bba")

oder so jetzt würde ich ja gerne meine spalte, also alle beobachtungen übergeben hast du einen vorschlag dafür?

Re: Mata Funktion ausführen

BeitragVerfasst: Di 28. Jan 2014, 19:28
von daniel
Lies die Dokumentation und Einführungsbücher. Der von Dir eingeschlagene Weg scheint extre umständlich und zeitraubens für Dich und andere zu sein.

Re: Mata Funktion ausführen

BeitragVerfasst: Di 28. Jan 2014, 19:39
von str3ber
Dazu muss ich ja der funktion matalev1var("original","vergleichvariable","newvar","....")

was kommt denn an die stelle von touse hab den hintergrund dort auch noch nicht verstanden...

mata : matalev1var("original","vergleichvariable","newvar","touse")
übergebe dann wird zwar gerechnet und newvar angelegt und auch ein numerischer wert übergeben allerdings ha dieser nichts mit der levenstein distanz zu tuen :)

Re: Mata Funktion ausführen

BeitragVerfasst: Di 28. Jan 2014, 19:41
von str3ber
Jetzt ist es ja fast geschafft es ist mein erstes Semester in C also generell in einer programmier sprache und ich verspreche stata und anschlieend mata zu lernen mit der hilfe von lernbücher aber dieses Problem muss jetzt über diesen weg funktionieren ich wäre dir unglaublich dankbar wenn du vllt weißt was da an der stelle passiert

Re: Mata Funktion ausführen

BeitragVerfasst: Di 28. Jan 2014, 20:52
von str3ber
Okay also es läuft... und versuche dann mal mich mit mata zu beschäftigen um eine neue schleife zu schreiben... denke ich habe deine geduld genug ausgereizt... Dankeschön!