Újdonságok a -ben

Jupyter Notebook a Stata-val

A Jupyter Notebook egy hatékony és könnyen használható webalkalmazás, amely lehetővé teszi a futtatható kód, a vizualizációk, a matematikai egyenletek és képletek, az elbeszélő szöveg és az egyéb gazdag adathordozók egyetlen dokumentumban („notebook”) történő összekapcsolását az interaktív számításhoz és fejlesztéshez. A kutatók és tudósok széles körben használták a Jupyter jegyzetfüzeteket, hogy megosszák ötleteiket és eredményeiket az együttműködés és az innováció terén.

Most meghívhatja a Stata és Mata alkalmazásokat a Jupyter Notebooks alkalmazásból az IPython (interaktív Python) kernellel, vagyis a Python és a Stata képességeit egyetlen környezetben egyesítheti, hogy munkája könnyen reprodukálható és megosztható legyen másokkal.

Nézzük hogyan mükődik

A Jupyter Notebook alkalmazásban a pystata Python csomag két eszközkészletét használhatja a Statával való interakcióhoz:

  1. három IPython (interactive Python) varázsparancs: stata, mata, és pystata
  2. API funkciók készlete

Mielőtt bemutatnánk, hogyan kell használni ezeket az eszközöket, konfiguráljuk a
pystata csomagot. Tegyük fel, hogy a Stata telepítve vana C:\Program Files\Stata17\ és Ön a Stata/MP kiadást használja. Stata a következőképpen inicializálható:

In [1]:

import stata_setup

stata_setup.config(“C:/Program Files/Stata17”, “mp”)

Kiemelt

  • Stata meghívása a Python-ból
    • Hívja a Statát stata, mata és pystata varázsparancsokkal
    • Hívja a Stata meghívását a PythonStata-ból egy API-függvénykészlet használatával
    • Használja a varázsparancsokat és az API funkciókat a Stata Function Interface (sfi) modullal együtt
  • Használja a Python-t és a Stata-t együtt
    • A Stata és a Mata elérése a Jupyter Notebook, a Jupyter Lab és más olyan környezetekből, amelyek támogatják az IPython kernelt
    • A Stata adatokat és eredményeket helyezze a Pythonba és fordítva
    • Kombinálja a Stata és a Python képességeit egyetlen környezetben

  ___  ____  ____  ____  ____ ©
 /__    /   ____/   /   ____/      17.0
___/   /   /___/   /   /___/       MP—Parallel Edition

 Statistics and Data Science       Copyright 1985-2021 StataCorp LLC
                                   StataCorp
                                   4905 Lakeway Drive
                                   College Station, Texas 77845 USA
                                   800-STATA-PC        https://www.stata.com
                                   979-696-4600        stata@stata.com

Stata license: 10-user 4-core network perpetual
Serial number: 1
  Licensed to: Stata Developer
               StataCorp LLC

Notes:
      1. Unicode is supported; see help unicode_advice.
      2. More than 2 billion observations are allowed; see help obs_advice.
      3. Maximum number of variables is set to 5,000; see help set_maxvar.

. 

Ha hasonló kimenetet kap, mint amit fent bemutattunk a Stata kiadásnál, ez azt jelenti, hogy minden megfelelően van konfigurálva; A konfigurálás további módjait lásd a Konfiguráció részben pystata.

Varázsparancsok segítségével hívja meg a Statát

A stata varázs a Stata parancsok IPython környezetben történő végrehajtására szolgál. Egy notebook cellába a %%stata cell varázs alá helyezzük a Stata parancsokat, hogy a cellát a Stata hívására irányítsuk. A következő parancsok betöltik az auto adatkészletet, és összefoglalják az mpg változót. A Stata kimenet a cella alatt jelenik meg.

In [2]:

%%stata

sysuse auto, clear

summarize mpg

. sysuse auto, clear
(1978 automobile data)

. summarize mpg

    Variable |        Obs        Mean    Std. dev.       Min        Max
-------------+---------------------------------------------------------
         mpg |         74     21.2973    5.785503         12         41

.  

A Stata grafikonjai az IPython környezetben is megjeleníthetők. Itt készítünk egy szórtáblát az autó futásteljesítményéről az ár és a %stata line varázs felhasználásával.

In [3]:

%stata scatter mpg price

Ezután betöltjük a Python adatait a Statába, elemzéseket hajtunk végre a Stata-ban, majd a Stata visszaküldött eredményeit továbbadjuk a Pythonnak további elemzés céljából, a második Nemzeti Egészségügyi és Táplálkozási Vizsgálat segítségével. (NHANES II; McDowell et al. 1981).
A NHANES II, az Egyesült Államokban a felnőttek és gyermekek egészségi és táplálkozási állapotáról szóló adatkészlet 10 351 megfigyelést és 58 változót tartalmaz, és egy nhanes2.csv nevű CSV fájlban van tárolva. Ezen változók között szerepel a hipertónia (highbp) , valamint a folyamatos változók age és a weight. mutatója.
A read_csv() -ból pandas módszerrel olvassuk le az adatokat a .csv fájlból egy nhanes2 nevű pandas adathalmazba.

In [4]:

import pandas as pd

import io

import requests

 

data = requests.get(https://www.stata.com/python/pystata/misc/nhanes2.csv”).content

nhanes2 = pd.read_csv(io.StringIO(data.decode(“utf-8”)))

nhanes2

Out [4]:

sampl strata psu region smsa location houssiz sex race age region4 smsa1 smsa2 smsa3 rural loglead agegrp highlead bmi highbp
0 1400 1 1 S 2 1 4 Male White 54 0 0 1 0 0 NaN 50-59 NaN 20.495686 0
1 1401 1 1 S 2 1 6 Female White 41 0 0 1 0 0 2.564949 40-49 lead<25 21.022337 0
2 1402 1 1 S 1 1 6 Female Other 21 0 1 0 0 0 NaN 20-29 NaN 24.973860 0
3 1404 1 1 S 2 1 9 Female White 63 0 0 1 0 0 NaN 60-69 NaN 35.728722 1
4 1405 1 1 S 1 1 3 Female White 64 0 1 0 0 0 2.995732 60-69 lead<25 27.923803 0
10346 48760 32 2 MW 4 48 5 Female White 35 0 0 0 1 1 NaN 30-39 NaN 20.355173 0
10347 48763 32 2 MW 4 48 2 Female White 33 0 0 0 1 1 1.945910 30-39 lead<25 41.645557 1
10348 48764 32 2 MW 4 48 1 Female White 60 0 0 0 1 0 NaN 60-69 NaN 35.626114 0
10349 48768 32 2 MW 4 48 1 Female White 29 0 0 0 1 0 NaN 20-29 NaN 19.204464 0
10350 48770 32 2 MW 4 48 1 Male White 31 0 0 0 1 1 NaN 30-39 NaN 19.635565 0

10351 rows ×58 columns

Az adatkeretet a Stata-ba töltjük be a %%stata varázslat -d argumentumának megadásával, majd a Stata-n belül egy logisztikai regressziós modellt illesztünk az age, weight, és az interakció felhasználásával a hipertónia valószínűségének előrejelzőjeként.
A Stata becslési eredményeit az ereturn list, alapján, beleértve az e(b) együtthatóvektort és a variancia – kovariancia mátrixot e(V), is, az -eret argumentum megadásával a myeret nevű Python szótárba toljuk.

In [5]:

%%stata -d nhanes2 -eret myeret

logistic highbp c.age##c.weight

ereturn list

. logistic highbp c.age##c.weight

Logistic regression                                    Number of obs =  10,351
                                                       LR chi2(3)    = 2381.23
                                                       Prob > chi2   =  0.0000
Log likelihood = -5860.1512                            Pseudo R2     =  0.1689

------------------------------------------------------------------------------
      highbp | Odds ratio   Std. err.      z    P>|z|     [95% conf. interval]
-------------+----------------------------------------------------------------
         age |   1.108531   .0080697    14.15   0.000     1.092827     1.12446
      weight |   1.081505    .005516    15.36   0.000     1.070748    1.092371
             |
       c.age#|
    c.weight |   .9992788   .0000977    -7.38   0.000     .9990873    .9994703
             |
       _cons |   .0002025   .0000787   -21.89   0.000     .0000946    .0004335
------------------------------------------------------------------------------
Note: _cons estimates baseline odds.

. ereturn list

scalars:
               e(rank) =  4
                  e(N) =  10351
                 e(ic) =  4
                  e(k) =  4
               e(k_eq) =  1
               e(k_dv) =  1
          e(converged) =  1
                 e(rc) =  0
                 e(ll) =  -5860.151218806021
         e(k_eq_model) =  1
               e(ll_0) =  -7050.765484416371
               e(df_m) =  3
               e(chi2) =  2381.2285312207
                  e(p) =  0
              e(N_cdf) =  0
              e(N_cds) =  0
               e(r2_p) =  .1688631210670459

macros:
            e(cmdline) : "logistic highbp c.age##c.weight"
                e(cmd) : "logistic"
            e(predict) : "logistic_p"
          e(estat_cmd) : "logit_estat"
          e(marginsok) : "default Pr"
       e(marginsnotok) : "stdp DBeta DEviance DX2 DDeviance Hat Number Resi.."
              e(title) : "Logistic regression"
           e(chi2type) : "LR"
                e(opt) : "moptimize"
                e(vce) : "oim"
               e(user) : "mopt__logit_d2()"
          e(ml_method) : "d2"
          e(technique) : "nr"
              e(which) : "max"
             e(depvar) : "highbp"
         e(properties) : "b V"

matrices:
                  e(b) :  1 x 4
                  e(V) :  4 x 4
                e(mns) :  1 x 4
              e(rules) :  1 x 4
               e(ilog) :  1 x 20
           e(gradient) :  1 x 4

functions:
             e(sample)   

.   

Az e(b) és az e e(V) fájlokhoz úgy férhetünk hozzá, hogy a myeret [’e (b)’] és a myeret [’e (V)’] parancsokat beírjuk Pythonba
A NumPy tömbökben vannak tárolva.

In [6]:

myeret [‘e(b)’], myeret[‘e(V)’]

(array([[ 1.03035513e-01,  7.83537342e-02, -7.21492384e-04,
         -8.50485078e+00]]),
 array([[ 5.29930771e-05,  3.50509317e-05, -6.97861002e-07,
         -2.69423163e-03],
        [ 3.50509317e-05,  2.60132664e-05, -4.74084051e-07,
         -1.94299575e-03],
        [-6.97861002e-07, -4.74084051e-07,  9.55811835e-09,
          3.50377699e-05],
        [-2.69423163e-03, -1.94299575e-03,  3.50377699e-05,
          1.50887842e-01]]))

Az age, előrejelzések ábrázolásához margókat és margótáblát használunk, amelyek egyértelműbben szemléltetik az age és a hipertónia valószínűsége közötti kapcsolatot.

In [7]:

%%stata

quietly margins, at(age=(20(10)80))

marginsplot

. quietly margins, at(age=(20(10)80))

. marginsplot

Variables that uniquely identify margins: age

.

Margókkal becsüljük meg a magas vérnyomás előrejelzett valószínűségét az age és a weight összes kombinációja esetében a 20 és 80 age közötti értékek esetében 5-ös lépésekben és a weight 40–180 kilogramm közötti értékek esetében szintén 5-ös lépéseket használunk. A saving(predictions, replace) elmenti az előrejelzéseket a predictions.dta. adatállományba. Célunk, hogy a Python segítségével elkészítsük ezeknek az előrejelzéseknek a háromdimenziós felületi diagramját.
Az predictions.dta adatkészlet az _at1 és _at2, változót tartalmazza, amelyek megfelelnek az age és weight értékeinek, amelyeket az at() opcióban adtunk meg. Az adatkészlet tartalmazza a _margin, változót is, amely a magas vérnyomás valószínűségének marginális előrejelzése. Nevezzük át azokat a változóka age, weight, és pr_highbp .
Végül az adathalmazt a Stata-ban preddata nevű pandas adatkeretként tároljuk a Pythonban az -doutd argumentum megadásával.

In [8]:

%%stata -doutd preddata

quietly margins, at(age=(20(5)80) weight=(40(5)180))

    saving(predictions, replace)

 

use predictions, clear

list _at1 _at2 _margin in 1/5

rename _at1 age

rename _at2 weight

rename _margin pr_highbp

. quietly margins, at(age=(20(5)80) weight=(40(5)180)) ///
>     saving(predictions, replace)

. 
. use predictions, clear
(Created by command margins; also see char list)

. list _at1 _at2 _margin in 1/5

     +------------------------+
     | _at1   _at2    _margin |
     |------------------------|
  1. |   20     40   .0200911 |
  2. |   20     45   .0274497 |
  3. |   20     50   .0374008 |
  4. |   20     55   .0507709 |
  5. |   20     60   .0685801 |
     +------------------------+

. rename _at1 age

. rename _at2 weight

. rename _margin pr_highbp

. 

Felsoroljuk az age, weight, pr_highbp oszlopok első öt megfigyelését az adathalmazon belül.

In [9]:

preddata[[‘age’, ‘weight’, ‘pr_highbp’]].head()

Out [9]:

S.NO age weight pr_highbp
0 20 40 0.020091
1 20 45 0.027450
2 20 50 0.037401
3 20 55 0.050771
4 20 60 0.068580

Ezután a Python segítségével létrehozunk egy háromdimenziós felületi ábrát. Először állítsuk be a grafikon méretét 10×8 hüvelykre a Matplotlib csomag pyplot moduljában található figure() módszerrel. Az axes() módszerrel meghatározzuk az ax nevű tengelyek háromdimenziós halmazát, és a plot_trisurf() metódussal megrajzoljuk a felületfelrajzot. Ezután beállítjuk az x, y és z tengely tick-jeit és címkéit. Végül beállítjuk a cselekmény magasságát és azimutját.

In [11]:

import matplotlib.pyplot as plt

import numpy as np

 

# define the axes

fig = plt.figure(1, figsize=(10, 8))

ax = plt.axes(projection=‘3d’)

 

# plot

ax.plot_trisurf(preddata[‘age’], preddata[‘weight’], preddata[‘pr_highbp’],cmap=plt.cm.Spectral_r)

 

# set ticks and labels for x, y, and z axes

ax.set_xticks(np.arange(20, 90, step=10))

ax.set_yticks(np.arange(40, 200, step=40))

ax.set_zticks(np.arange( 0, 1.2, step=0.2))

ax.set_xlabel(Age (years)”)

ax.set_ylabel(Weight (kg)”)

ax.set_zlabel(Probability of Hypertension”)

 

# adjust the view angle

ax.view_init(elev=30, azim=240)

 

# show the plot

plt.show()

Bemutattuk, hogyan férhetünk hozzá a Stata-hoz a Pythonból, de a Mata-t is elérhetjük a Python-ból a mata varázs segítségével; lásd a mata varázslatot és a 4. példát: Mata használata.

Interakció a Statával az API funkciók használatával

A Statával interakcióba léphetünk a pystata Python csomag konfig és stata moduljaiban definiált funkciók használatával is. Bemutatjuk, hogyan lehet ezeket az API-funkciókat használni a Stata-val való interakcióra a %%stata varázsparancs alternatívájaként.
A stata modult a pystata. -ból importáljuk. Ezután hívja meg a pdataframe_to_data () metódust a pandas dataframe nhanes2 Stata-ba való betöltéséhez, és hívja meg a run() metódust, hogy illeszkedjen a logisztikai regressziós modellhez.

In [12]:

from pystata import
stata

 

stata.pdataframe_to_data(nhanes2, force=True)

stata.run(‘logistic highbp c.age##c.weight’)

Logistic regression                                    Number of obs =  10,351
                                                       LR chi2(3)    = 2381.23
                                                       Prob > chi2   =  0.0000
Log likelihood = -5860.1512                            Pseudo R2     =  0.1689

------------------------------------------------------------------------------
      highbp | Odds ratio   Std. err.      z    P>|z|     [95% conf. interval]
-------------+----------------------------------------------------------------
         age |   1.108531   .0080697    14.15   0.000     1.092827     1.12446
      weight |   1.081505    .005516    15.36   0.000     1.070748    1.092371
             |
       c.age#|
    c.weight |   .9992788   .0000977    -7.38   0.000     .9990873    .9994703
             |
       _cons |   .0002025   .0000787   -21.89   0.000     .0000946    .0004335
------------------------------------------------------------------------------
Note: _cons estimates baseline odds.

Ezután a get_ereturn () metódussal tároljuk a Python logistic parancs által visszaadott e() eredményeit myeret2 nevű szótárként, és megjelenítjük benne az e(b) és az e(V) szavakat.

In [13]:

myeret2 = stata.get_ereturn()

myeret2[‘e(b)’], myeret2[‘e(V)’]

Out [13]:

(array([[ 1.03035513e-01,  7.83537342e-02, -7.21492384e-04,
         -8.50485078e+00]]),
 array([[ 5.29930771e-05,  3.50509317e-05, -6.97861002e-07,
         -2.69423163e-03],
        [ 3.50509317e-05,  2.60132664e-05, -4.74084051e-07,
         -1.94299575e-03],
        [-6.97861002e-07, -4.74084051e-07,  9.55811835e-09,
          3.50377699e-05],
        [-2.69423163e-03, -1.94299575e-03,  3.50377699e-05,
          1.50887842e-01]]))

Ezután a run () metódust hívjuk meg a hipertónia előrejelzett valószínűségének becsléséhez az életkor és a súly összes kombinációjára, az előrejelzési eredményeket elmentjük egy prediktív névre keresztelt adatkészletbe, és betöltjük az adatállományt a Statába, és átnevezzük a változókat.

In [14]:

stata.run(”’

quietly margins, at(age=(20(5)80) weight=(40(5)180)) ///

    saving(predictions, replace)

 

use predictions, clear

list _at1 _at2 _margin in 1/5

rename _at1 age

rename _at2 weight

rename _margin pr_highbp

”’)

. 
. quietly margins, at(age=(20(5)80) weight=(40(5)180)) ///
>     saving(predictions, replace)

. 
. use predictions, clear
(Created by command margins; also see char list)

. list _at1 _at2 _margin in 1/5

     +------------------------+
     | _at1   _at2    _margin |
     |------------------------|
  1. |   20     40   .0200911 |
  2. |   20     45   .0274497 |
  3. |   20     50   .0374008 |
  4. |   20     55   .0507709 |
  5. |   20     60   .0685801 |
     +------------------------+

. rename _at1 age

. rename _at2 weight

. rename _margin pr_highbp

.

A stata modulban a pdataframe_from_data () funkciót meghívjuk az age, súly és pr_highbp aktuális adatkészletben történő tárolására egy preddata2 nevű pandas adathalmazba.

In [15]:

preddata2 = stata.pdataframe_from_data(var=“age weight pr_highbp”)

preddata2.head()

Out [15]:

age weight pr_highbp
0 20 40 0.020091
1 20 45 0.027450
2 20 50 0.037401
3 20 55 0.050771
4 20 60 0.068580

Miután megvan ez az adatkeret, létrehozhatjuk ugyanazt a háromdimenziós felületi diagramot, mint fent.
Ne feledje, hogy a Stata Function Interface (sfi) modult is használhatja a Stata alapvető szolgáltatásainak eléréséhez.
Ezen eszközök kombinációja sokkal könnyebbé teszi a Jupyter Notebook Stata-val való kapcsolatát; lásd az 5. példát: Hívja a Statát az API funkciók segítségével.

Referenciák

Hunter, J. D. 2007. Matplotlib: A 2D Graphics Environment. Computing in Science & Engineering 9: 90–95.
McDowell, A., A. Engel, J. T. Massey, and K. Maurer. 1981. Plan and operation of the Second National Health and Nutrition Examination Survey, 1976–1980. Vital and Health Statistics 1(15): 1–144.
Mckinney, W. 2010. Data Structures for Statistical Computing in Python. Proceedings of the 9th Python in Science Conference, 56–61. (publisher link).
Oliphant, T. E. 2006. A Guide to NumPy, 2nd ed. Austin, TX: Continuum Press.
Péz, F., and B. E. Granger. 2007. IPython: A System for Interactive Scientific Computing, Computing in Science and Engineering 9: 21–29. DOI:10.1109/MCSE.2007.53 (publisher link)