Ú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:
- három IPython (interactive Python) varázsparancs: stata, mata, és pystata
- 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]:
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]:
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()

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]:
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)