{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# A brief tour of data wrangling for psychologists in python"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## By using python for data analyses, you win:\n",
"\n",
"- A real programming language (i.e. more transferable skill) \n",
"- Beauty, elegance, **readability**, in short the zen of python (ex?) \n",
"- The ultimate glue/scripting language\n",
"- Usually more straightforward to do non-statistical tasks in Python (than in R), e.g. fancy preprocessing, string processing, web scraping, file handling,...\n",
"- Connections to many well-developed scientific libraries: numpy (matrix computations), scipy (scientific computing), scikit.image (image processing), scikit.learn (machine learning),...\n",
"- Interactive notebooks! (because the [paper is getting obsolete](https://www.theatlantic.com/science/archive/2018/04/the-scientific-paper-is-obsolete/556676/))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## You lose:\n",
"\n",
"- Switch cost (often considerable for non-professional programmers) when you program experiments in python anyway \n",
"- Basic data analysis functionality that is not built-in but available through libraries (even more modular than R)\n",
"- Specific advanced analysis techniques not available (others, such as machine learning tools are often better supported in python). This is rapidly improving, but still more in alpha/beta stage instead of finished/tested/documented libraries.\n",
"- The large knowledge base/support (as a statistics tool) that R has (e.g. in the department)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# But lots of commonalities in the logic of data wrangling, plotting & analyzing\n",
"\n",
"No reason to choose, you can use both **depending on your needs or processing stage**. For example:\n",
"\n",
"- You wrote your experiment in python and want to do some preliminary preprocessing or (descriptive) analyses on single-subject data immediately after this individual is tested. You don't need to switch to R (the psychopy trialHandler gives you immediate access to a pandas dataframe of your data).\n",
"- You want to automatize some operation on files such as datafiles, images, etc. (renaming, reformatting, resizing, or equating images on some feature) or on strings in files (eg your recorded data does not have the right formatting). This is easier in python.\n",
"- Then you want to take advantage of tidyverse/ggplot2, you switch to R.\n",
"- You want to do a (generalized) mixed model or Bayesian analysis, you stay in R.\n",
"- You like to apply a fancy machine learning algorithm to your data, you switch to python again.\n",
"\n",
"All steps can be done in either language but effort/support differs depending on case.\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# In python statistical functionality is not built-in..."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Useful python packages for psychologists\n",
"\n",
"#### In order of importance:\n",
"- [Jupyter notebooks](http://jupyter.org/) or better: [Jupyterlab](https://blog.jupyter.org/jupyterlab-is-ready-for-users-5a6f039b8906) (the Rstudio of python, with interactive \"shiny app\"-like functionality)\n",
"- [pandas](https://pandas.pydata.org/): data handling & descriptive analyses, \n",
"- Plotting: [matplotlib](https://matplotlib.org/) (~R base plotting), [seaborn](http://seaborn.pydata.org/index.html) (written by a cognitive neuroscientist) and/or [plotnine](http://plotnine.readthedocs.io/en/stable/) (ggplot2 alternative)\n",
"- [statsmodels](https://www.statsmodels.org): statistical models (glm, t-tests,...)\n",
"- Specialized analyses: [Psignifit](http://psignifit.sourceforge.net/) (psychometric function fitting), [Bambi](https://github.com/bambinos/bambi)/[Kabuki](https://github.com/hddm-devs/kabuki) (hierarchical bayesian models), [NIPY](http://nipy.org/), [MNE](http://martinos.org/mne/stable/index.html), [PyMVPA](http://www.pymvpa.org/) \n",
"- [More libraries](https://www.marsja.se/best-python-libraries-psychology/)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Matplotlib Version: 2.2.3\n",
"NumPy Version: 1.15.2\n",
"('Pandas Version:', u'0.23.0')\n",
"Python Version: 2.7.15+ (default, Oct 2 2018, 22:12:08) \n",
"[GCC 8.2.0]\n",
"Ran on 2018-11-14T18:39:29.291564\n",
"{'commit_hash': u'a0d6ad545',\n",
" 'commit_source': 'installation',\n",
" 'default_encoding': 'UTF-8',\n",
" 'ipython_path': '/usr/local/lib/python2.7/dist-packages/IPython',\n",
" 'ipython_version': '5.7.0',\n",
" 'os_name': 'posix',\n",
" 'platform': 'Linux-4.18.0-10-generic-x86_64-with-Ubuntu-18.10-cosmic',\n",
" 'sys_executable': '/usr/bin/python',\n",
" 'sys_platform': 'linux2',\n",
" 'sys_version': '2.7.15+ (default, Oct 2 2018, 22:12:08) \\n[GCC 8.2.0]'}\n",
"matplotlib==2.2.3\n",
"pandas==0.23.0\n",
"seaborn==0.8.1\n",
"statsmodels==0.8.0\n"
]
}
],
"source": [
"import numpy as np\n",
"import matplotlib as mpl\n",
"import matplotlib.pyplot as plt # roughly ~base R plotting functionality\n",
"import pandas as pd #roughly ~base R & tidyr functionality \n",
"import seaborn as sns #roughly ~ggplot2 functionality\n",
"import statsmodels.api as sm\n",
"import statsmodels.formula.api as smf\n",
"import warnings\n",
"warnings.filterwarnings('ignore')\n",
"\n",
"#to make the plots appear inline, and saved in notebook:\n",
"%matplotlib inline\n",
"sns.set_context(\"talk\") # seaborn function to make plots according to purpose (talk, paper, poster, notebook)\n",
"\n",
"# We'll show people what versions we use\n",
"import datetime\n",
"now = datetime.datetime.now().isoformat()\n",
"print('Ran on ' + now)\n",
"import IPython\n",
"print(IPython.sys_info())\n",
"!pip freeze | grep -E 'seaborn|matplotlib|pandas|statsmodels'"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Pandas for data wrangling\n",
"\n",
"\n",
"Multiple great tutorials already exist on how to handle, clean and shaping data into the right format(s) for your visualizations and analyses in python. I was helped by the [10 minutes to pandas tutorial](https://pandas.pydata.org/pandas-docs/stable/10min.html), this [brief overview](https://drive.google.com/open?id=0BwlD7q-DXkdWRUMyc19NdGNKRHc), I still regularly need to check this [cheat sheet](https://drive.google.com/open?id=0BwlD7q-DXkdWVkJQLVhGeHA3elk), and of course google/stackoverflow gives you access to the very bright and helpful python data science community. \n",
"\n",
"If you want a more thorough explanation of pandas, check this [book on python for data analysis](https://drive.google.com/open?id=0BwlD7q-DXkdWZHB6a0szLVN5WDQ) or this [Python Data Science Handbook](https://github.com/jakevdp/PythonDataScienceHandbook).\n",
"\n",
"Rather than rehash what's in those works, we will learn by example using the data from a Navon experiment with hierarchical letters probing precedence and interference of global processing. For more background and a description of the experiment, see [Chamberlain et al. (2017)](https://drive.google.com/open?id=0BwlD7q-DXkdWeEJaUWtwaTlPYU0):\n",
"\n",
"> \"The Navon task was a modified version of a hierarchical letter paradigm (Navon, 1977), designed to reduce the potential influence of factors confounding global processing such as spatial location and variation in shape characteristics. Participants were required to distinguish whether a global letter shape made up of local letters or the local letters themselves were vowels or consonants (Fig. 1). Vowel and consonant letter shapes were kept as comparable as possible. There were 5 consonant types (C, D, F, H, T) and 5 vowel types (A, E, I, O, U). Trial congruency was defined by the category type (vowel/consonant). In some congruent trials the exact letter identity matched between local and global stimulus levels, whilst in all other congruent trials only the category type matched. Presentation location of the test stimulus was randomized on a trial-by-trial basis, in order to eliminate the ability of participants to fixate on local spatial locations to determine global shape. The stimulus was presented in one of four corners of a 100x100-pixel square around central fixation. There were 10 practice trials followed by two blocks of 100 experimental trials.\n",
"In alternate blocks whose order was randomized, participants were instructed to either focus on the global letter shape (global selective attention) or on the local letter shapes (local selective attention) and press the ‘J’ key if the letter was a vowel, and the ‘F’ key if the letter was a consonant. Each trial began with a fixation cross presented for 1000 ms. The fixation cross then disappeared and was followed by the experimental stimulus (a white letter\n",
"shape on a black background). The stimuli were presented for 300 ms followed by a 4 s response window. Feedback was presented in the form of a coloured (red/green) fixation cross which also encouraged central fixation for the next trial. Both accuracy and reaction time(s) were recorded. Stimulus presentation and data collection were controlled using the Psychopy package (Peirce, 2007) and stimuli were created using the MATLAB toolbox GERT (v1.20) (Demeyer & Machilsen, 2012).\"\n",
"\n",
""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Reading in our data..."
]
},
{
"cell_type": "code",
"execution_count": 153,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"/home/sander/Bureaublad/Dropbox/exp/Reproducible_workflow_tutorial/PythoninPsy\n",
"CO10 demographicNavonGlobCO10.csv demographicNavonLocCO10.csv\n",
"CO12 demographicNavonGlobCO12.csv demographicNavonLocCO12.csv\n"
]
}
],
"source": [
"!pwd\n",
"!ls data/ #we can use shell commands to see where the data is (ls=dir on windows)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
acc_mean
\n",
"
acc_raw
\n",
"
acc_std
\n",
"
age
\n",
"
cond
\n",
"
condition
\n",
"
congruence
\n",
"
corrAns
\n",
"
expversion
\n",
"
gender
\n",
"
...
\n",
"
n
\n",
"
order
\n",
"
participant
\n",
"
resp_raw
\n",
"
rt_mean
\n",
"
rt_raw
\n",
"
rt_std
\n",
"
stimFile
\n",
"
xPos
\n",
"
yPos
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
1
\n",
"
1
\n",
"
0
\n",
"
18.0
\n",
"
selAttGlob
\n",
"
Cc
\n",
"
congruent
\n",
"
['f']
\n",
"
NaN
\n",
"
F
\n",
"
...
\n",
"
1
\n",
"
18
\n",
"
12277
\n",
"
'f'
\n",
"
0,746331811
\n",
"
0,746331811
\n",
"
0
\n",
"
Global_C_local_C.png
\n",
"
NaN
\n",
"
-50
\n",
"
\n",
"
\n",
"
1
\n",
"
1
\n",
"
1
\n",
"
0
\n",
"
18.0
\n",
"
selAttGlob
\n",
"
Cc
\n",
"
congruent
\n",
"
['f']
\n",
"
NaN
\n",
"
F
\n",
"
...
\n",
"
1
\n",
"
41
\n",
"
12277
\n",
"
'f'
\n",
"
0,687273145
\n",
"
0,687273145
\n",
"
0
\n",
"
Global_C_local_D.png
\n",
"
NaN
\n",
"
50
\n",
"
\n",
"
\n",
"
2
\n",
"
1
\n",
"
1
\n",
"
0
\n",
"
18.0
\n",
"
selAttGlob
\n",
"
Cc
\n",
"
congruent
\n",
"
['f']
\n",
"
NaN
\n",
"
F
\n",
"
...
\n",
"
1
\n",
"
46
\n",
"
12277
\n",
"
'f'
\n",
"
0,705967069
\n",
"
0,705967069
\n",
"
0
\n",
"
Global_C_local_F.png
\n",
"
NaN
\n",
"
-50
\n",
"
\n",
"
\n",
"
3
\n",
"
1
\n",
"
1
\n",
"
0
\n",
"
18.0
\n",
"
selAttGlob
\n",
"
Cc
\n",
"
congruent
\n",
"
['f']
\n",
"
NaN
\n",
"
F
\n",
"
...
\n",
"
1
\n",
"
78
\n",
"
12277
\n",
"
'f'
\n",
"
0,661773503
\n",
"
0,661773503
\n",
"
0
\n",
"
Global_C_local_H.png
\n",
"
NaN
\n",
"
-50
\n",
"
\n",
"
\n",
"
4
\n",
"
1
\n",
"
1
\n",
"
0
\n",
"
18.0
\n",
"
selAttGlob
\n",
"
Cc
\n",
"
congruent
\n",
"
['f']
\n",
"
NaN
\n",
"
F
\n",
"
...
\n",
"
1
\n",
"
74
\n",
"
12277
\n",
"
'f'
\n",
"
0,794407368
\n",
"
0,794407368
\n",
"
0
\n",
"
Global_C_local_T.png
\n",
"
NaN
\n",
"
-50
\n",
"
\n",
" \n",
"
\n",
"
5 rows × 21 columns
\n",
"
"
],
"text/plain": [
" acc_mean acc_raw acc_std age cond condition congruence corrAns \\\n",
"0 1 1 0 18.0 selAttGlob Cc congruent ['f'] \n",
"1 1 1 0 18.0 selAttGlob Cc congruent ['f'] \n",
"2 1 1 0 18.0 selAttGlob Cc congruent ['f'] \n",
"3 1 1 0 18.0 selAttGlob Cc congruent ['f'] \n",
"4 1 1 0 18.0 selAttGlob Cc congruent ['f'] \n",
"\n",
" expversion gender ... n order participant resp_raw rt_mean \\\n",
"0 NaN F ... 1 18 12277 'f' 0,746331811 \n",
"1 NaN F ... 1 41 12277 'f' 0,687273145 \n",
"2 NaN F ... 1 46 12277 'f' 0,705967069 \n",
"3 NaN F ... 1 78 12277 'f' 0,661773503 \n",
"4 NaN F ... 1 74 12277 'f' 0,794407368 \n",
"\n",
" rt_raw rt_std stimFile xPos yPos \n",
"0 0,746331811 0 Global_C_local_C.png NaN -50 \n",
"1 0,687273145 0 Global_C_local_D.png NaN 50 \n",
"2 0,705967069 0 Global_C_local_F.png NaN -50 \n",
"3 0,661773503 0 Global_C_local_H.png NaN -50 \n",
"4 0,794407368 0 Global_C_local_T.png NaN -50 \n",
"\n",
"[5 rows x 21 columns]"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import glob, os #to work with paths\n",
"\n",
"df = pd.DataFrame()\n",
"folders = ['CO10','CO12'] # the raw data is in two different folders\n",
"\n",
"for folder in folders:\n",
" if folder=='CO10': sep=';' #data in different folders use different field separators\n",
" else: sep=','\n",
" \n",
" all_files = glob.glob(os.path.join('data', folder, \"*.csv\")) # get list of individual data files\n",
" df_from_each_file = (pd.read_csv(f, sep=sep, index_col=0) for f in all_files)\n",
" concatenated_df = pd.concat(df_from_each_file, ignore_index=True)\n",
" df = df.append([df,concatenated_df])\n",
"\n",
"df.head()"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
Subject
\n",
"
age
\n",
"
gender
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
7576
\n",
"
19.0
\n",
"
1.0
\n",
"
\n",
"
\n",
"
1
\n",
"
10711
\n",
"
20.0
\n",
"
1.0
\n",
"
\n",
"
\n",
"
2
\n",
"
10771
\n",
"
20.0
\n",
"
1.0
\n",
"
\n",
"
\n",
"
3
\n",
"
11200
\n",
"
19.0
\n",
"
1.0
\n",
"
\n",
"
\n",
"
4
\n",
"
11212
\n",
"
18.0
\n",
"
1.0
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Subject age gender\n",
"0 7576 19.0 1.0\n",
"1 10711 20.0 1.0\n",
"2 10771 20.0 1.0\n",
"3 11200 19.0 1.0\n",
"4 11212 18.0 1.0"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# add demographics\n",
"all_files = glob.glob(os.path.join('data', \"*.csv\"))\n",
"df_from_each_file = (pd.read_csv(f, sep=sep, index_col=0) for f in all_files)\n",
"\n",
"dfdemo = (pd.concat(df_from_each_file, ignore_index=True, axis=0)\n",
" .drop_duplicates(['Subject'], keep='first', inplace=False) # drop duplicate rows for subjects\n",
" .sort_values('Subject') \n",
" )\n",
"\n",
"dfdemo.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Note the **method chaining** in the example above. Most pandas methods return a DataFrame so that another pandas method can be applied to the result (with the dot formulation). Using the [pandas-ply](https://github.com/coursera/pandas-ply) library you can also use dplyr style piping in pandas. Depending on how you value code readability, performance or debugging you'll prefer one or the other."
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"18.0 145\n",
"19.0 78\n",
"20.0 24\n",
"21.0 10\n",
"23.0 4\n",
"24.0 4\n",
"40.0 1\n",
"28.0 1\n",
"17.0 1\n",
"25.0 1\n",
"41.0 1\n",
"22.0 1\n",
"26.0 1\n",
"Name: age, dtype: int64\n",
"18.0 145\n",
"19.0 78\n",
"20.0 24\n",
"21.0 10\n",
"23.0 4\n",
"24.0 4\n",
"40.0 1\n",
"28.0 1\n",
"17.0 1\n",
"25.0 1\n",
"41.0 1\n",
"22.0 1\n",
"26.0 1\n",
"Name: age, dtype: int64\n"
]
}
],
"source": [
"print dfdemo.age.value_counts()\n",
"print df.groupby(['participant']).age.apply(lambda x: x.iloc[0]).value_counts()"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"# age column is the same between dfs so we can drop it in the original data before merging\n",
"df=df.drop(['age'], axis=1)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
acc_mean
\n",
"
acc_raw
\n",
"
acc_std
\n",
"
cond
\n",
"
condition
\n",
"
congruence
\n",
"
corrAns
\n",
"
expversion
\n",
"
gender_x
\n",
"
location
\n",
"
...
\n",
"
resp_raw
\n",
"
rt_mean
\n",
"
rt_raw
\n",
"
rt_std
\n",
"
stimFile
\n",
"
xPos
\n",
"
yPos
\n",
"
Subject
\n",
"
age
\n",
"
gender_y
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
1
\n",
"
1
\n",
"
0
\n",
"
selAttGlob
\n",
"
Cc
\n",
"
congruent
\n",
"
['f']
\n",
"
NaN
\n",
"
F
\n",
"
left_right
\n",
"
...
\n",
"
'f'
\n",
"
0,746331811
\n",
"
0,746331811
\n",
"
0
\n",
"
Global_C_local_C.png
\n",
"
NaN
\n",
"
-50
\n",
"
12277
\n",
"
18.0
\n",
"
1.0
\n",
"
\n",
"
\n",
"
1
\n",
"
1
\n",
"
1
\n",
"
0
\n",
"
selAttGlob
\n",
"
Cc
\n",
"
congruent
\n",
"
['f']
\n",
"
NaN
\n",
"
F
\n",
"
up_right
\n",
"
...
\n",
"
'f'
\n",
"
0,687273145
\n",
"
0,687273145
\n",
"
0
\n",
"
Global_C_local_D.png
\n",
"
NaN
\n",
"
50
\n",
"
12277
\n",
"
18.0
\n",
"
1.0
\n",
"
\n",
"
\n",
"
2
\n",
"
1
\n",
"
1
\n",
"
0
\n",
"
selAttGlob
\n",
"
Cc
\n",
"
congruent
\n",
"
['f']
\n",
"
NaN
\n",
"
F
\n",
"
down_right
\n",
"
...
\n",
"
'f'
\n",
"
0,705967069
\n",
"
0,705967069
\n",
"
0
\n",
"
Global_C_local_F.png
\n",
"
NaN
\n",
"
-50
\n",
"
12277
\n",
"
18.0
\n",
"
1.0
\n",
"
\n",
"
\n",
"
3
\n",
"
1
\n",
"
1
\n",
"
0
\n",
"
selAttGlob
\n",
"
Cc
\n",
"
congruent
\n",
"
['f']
\n",
"
NaN
\n",
"
F
\n",
"
left_right
\n",
"
...
\n",
"
'f'
\n",
"
0,661773503
\n",
"
0,661773503
\n",
"
0
\n",
"
Global_C_local_H.png
\n",
"
NaN
\n",
"
-50
\n",
"
12277
\n",
"
18.0
\n",
"
1.0
\n",
"
\n",
"
\n",
"
4
\n",
"
1
\n",
"
1
\n",
"
0
\n",
"
selAttGlob
\n",
"
Cc
\n",
"
congruent
\n",
"
['f']
\n",
"
NaN
\n",
"
F
\n",
"
down_right
\n",
"
...
\n",
"
'f'
\n",
"
0,794407368
\n",
"
0,794407368
\n",
"
0
\n",
"
Global_C_local_T.png
\n",
"
NaN
\n",
"
-50
\n",
"
12277
\n",
"
18.0
\n",
"
1.0
\n",
"
\n",
" \n",
"
\n",
"
5 rows × 23 columns
\n",
"
"
],
"text/plain": [
" acc_mean acc_raw acc_std cond condition congruence corrAns \\\n",
"0 1 1 0 selAttGlob Cc congruent ['f'] \n",
"1 1 1 0 selAttGlob Cc congruent ['f'] \n",
"2 1 1 0 selAttGlob Cc congruent ['f'] \n",
"3 1 1 0 selAttGlob Cc congruent ['f'] \n",
"4 1 1 0 selAttGlob Cc congruent ['f'] \n",
"\n",
" expversion gender_x location ... resp_raw rt_mean \\\n",
"0 NaN F left_right ... 'f' 0,746331811 \n",
"1 NaN F up_right ... 'f' 0,687273145 \n",
"2 NaN F down_right ... 'f' 0,705967069 \n",
"3 NaN F left_right ... 'f' 0,661773503 \n",
"4 NaN F down_right ... 'f' 0,794407368 \n",
"\n",
" rt_raw rt_std stimFile xPos yPos Subject age gender_y \n",
"0 0,746331811 0 Global_C_local_C.png NaN -50 12277 18.0 1.0 \n",
"1 0,687273145 0 Global_C_local_D.png NaN 50 12277 18.0 1.0 \n",
"2 0,705967069 0 Global_C_local_F.png NaN -50 12277 18.0 1.0 \n",
"3 0,661773503 0 Global_C_local_H.png NaN -50 12277 18.0 1.0 \n",
"4 0,794407368 0 Global_C_local_T.png NaN -50 12277 18.0 1.0 \n",
"\n",
"[5 rows x 23 columns]"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df= pd.merge(df, dfdemo, how='left', left_on='participant', right_on='Subject')\n",
"df.head()"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"sns.distplot(df.age.dropna(), kde=False);"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Dataframe characteristics"
]
},
{
"cell_type": "code",
"execution_count": 321,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Variables:\n",
"Index([u'acc_mean', u'acc_raw', u'acc_std', u'age_x', u'cond', u'condition',\n",
" u'congruence', u'corrAns', u'expversion', u'gender_x', u'location',\n",
" u'n', u'order', u'participant', u'resp_raw', u'rt_mean', u'rt_raw',\n",
" u'rt_std', u'stimFile', u'xPos', u'yPos', u'Subject', u'age_y',\n",
" u'gender_y'],\n",
" dtype='object')\n",
"variables:\n",
"acc_mean int64\n",
"acc_raw int64\n",
"acc_std int64\n",
"age_x float64\n",
"cond object\n",
"condition object\n",
"congruence object\n",
"corrAns object\n",
"expversion object\n",
"gender_x object\n",
"location object\n",
"n int64\n",
"order int64\n",
"participant int64\n",
"resp_raw object\n",
"rt_mean object\n",
"rt_raw object\n",
"rt_std int64\n",
"stimFile object\n",
"xPos float64\n",
"yPos int64\n",
"Subject int64\n",
"age_y float64\n",
"gender_y float64\n",
"dtype: object\n",
"nb of participants: 275\n",
"trials per participant: 309\n"
]
}
],
"source": [
"print 'Variables:\\n', df.columns\n",
"print 'variables:\\n', df.dtypes\n",
"print 'nb of participants:', len(df['participant'].unique())\n",
"print 'trials per participant:', len(df)/ len(df['participant'].unique()) #not exactly"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Cleaning data"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"# rename a variable/column\n",
"df = df.rename(columns={'acc_raw': 'acc', 'rt_raw': 'rt'})"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
"#properly format RTs (dot notation)\n",
"df['rt'] = df['rt'].apply(lambda x: str(x).replace(',','.')).astype('float64')\n",
"# fill in missing values\n",
"df.loc[df.rt<0,['rt']]= np.nan"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"F 44800\n",
"M 15600\n",
"Name: gender_x, dtype: int64"
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# we have 2 gender columns now, how do they compare?\n",
"df.gender_x.value_counts()"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [],
"source": [
"# Correcting values in gender column\n",
"df.loc[df['gender_x'] == 'vrouw', 'gender_x'] = 'F'"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"count 151\n",
"unique 2\n",
"top F\n",
"freq 112\n",
"Name: gender_x, dtype: object\n",
"count 60400\n",
"unique 2\n",
"top F\n",
"freq 44800\n",
"Name: gender_x, dtype: object\n",
"F 44800\n",
"M 15600\n",
"Name: gender_x, dtype: int64\n"
]
}
],
"source": [
"df.groupby('gender_x')['participant'].nunique()\n"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"count 151.0\n",
"unique 2.0\n",
"top 1.0\n",
"freq 110.0\n",
"Name: gender_y, dtype: float64\n",
"count 60400.0\n",
"unique 2.0\n",
"top 1.0\n",
"freq 44000.0\n",
"Name: gender_y, dtype: float64\n",
"1.0 44000\n",
"0.0 16400\n",
"Name: gender_y, dtype: int64\n"
]
}
],
"source": [
"# check gender stats\n",
"df.groupby('gender_y')['participant'].nunique()\n"
]
},
{
"cell_type": "code",
"execution_count": 245,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"acc_mean 0\n",
"acc 0\n",
"acc_std 0\n",
"age_x 600\n",
"cond 0\n",
"condition 0\n",
"congruence 0\n",
"corrAns 0\n",
"expversion 60400\n",
"gender_x 24800\n",
"location 0\n",
"n 0\n",
"order 0\n",
"participant 0\n",
"resp_raw 302\n",
"rt_mean 0\n",
"rt 302\n",
"rt_std 0\n",
"stimFile 0\n",
"xPos 60400\n",
"yPos 0\n",
"Subject 0\n",
"age_y 600\n",
"gender_y 24800\n",
"dtype: int64"
]
},
"execution_count": 245,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# count missing values\n",
"df.isnull().sum()"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [],
"source": [
"# Save merged data\n",
"df.to_csv('dfmerged.csv')"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"# Save merged data\n",
"df = pd.read_csv('dfmerged.csv')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Group by: split-apply-combine\n",
"\n",
"Common operation:\n",
"- Splitting the data into groups based on some criteria\n",
"- Applying a function to each group independently\n",
"- Combining the results into a data structure\n",
"\n",
"Can be about: \n",
"- calculating some aggregate measurement for each group (*agg(function)*, *size()*, *mean()*, *apply(function)*, *rolling()*, etc.)\n",
"- filtering the rows on a property of the group they belong to (*filter()*)\n",
"- calculating a new value for each row based on a property of the group (*transform()*), e.g. create a column with Z-scores\n",
"\n",
"It helps to start with the result you want, and work backwards from there. If you want to get a single value for each group, use aggregate(), apply() (or one of the shortcuts). If you want to get a subset of the original rows, use filter(). And if you want to get a new value for each original row, use transform(). Check [this page](https://pandas.pydata.org/pandas-docs/stable/cookbook.html#cookbook-grouping) for some more advanced groupby recipes. Note that *apply()* is [most flexible](http://pandas-docs.github.io/pandas-docs-travis/groupby.html#flexible-apply) because it can implement an aggregate or a transform, and anything in between. Examples follow..."
]
},
{
"cell_type": "code",
"execution_count": 289,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"cond congruence \n",
"selAttGlob congruent 0.918967\n",
" incongruent 0.899812\n",
"selAttLoc congruent 0.936808\n",
" incongruent 0.894413\n",
"Name: acc, dtype: float64"
]
},
"execution_count": 289,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.groupby(['cond', 'congruence']).acc.mean() #.reset_index()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Insert a column with standardized RT:"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [],
"source": [
"zscore = lambda x: (x - x.mean()) / x.std()\n",
"df.insert(17, 'Zage', df.groupby(['participant'])['age'].transform(zscore))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Removing outliers"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.08750000000000002"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# proportion of incorrect trials\n",
"1-df.acc.mean()"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"sns.distplot(df.groupby(['participant']).acc.mean(), bins=20);"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Get help on how to use a method:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"?sns.distplot()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Or just press *shift-tab* when cursor is on a method/module to view info. Note that you can find all jupyter lab commands in the left panel, under the *Commands* tab. You can also open a console (file-> view console for notebook) to quickly try out some code before entering them in a cell."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Remove participants with mean accuracy lower than (mean acc - 2.5*std of accuracy) "
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"266\n"
]
}
],
"source": [
"df = df.groupby('participant').filter(\n",
" lambda x : x['acc'].mean() > df.acc.mean()-(2.5*df.groupby(['participant']).acc.mean().std()))\n",
"\n",
"print len(df.participant.unique())"
]
},
{
"cell_type": "code",
"execution_count": 45,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"g = sns.factorplot(x=\"condition\", y=\"rt\", hue=\"congruence\",\n",
" col=\"cond\", unit='participant', data=dfrt, kind=\"point\"); \n",
"\n",
"g.set(xlabel=\"Condition\", yticklabels=[y for y in np.linspace(0,.6,6)]);"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Some features of Seaborn plots:\n",
"\n",
"- [Factorplot](https://seaborn.pydata.org/generated/seaborn.factorplot.html#seaborn.factorplot) is a categorical, faceted plot: \"It is important to choose how variables get mapped to the plot structure such that the most important comparisons are easiest to make. As a general rule, it is easier to compare positions that are closer together, so the hue variable should be used for the most important comparisons\".\n",
"- Note the unit parameter: Identifier of sampling units, which will be used to perform a multilevel bootstrap for the confidence intervals (errorbars) and account for repeated measures design.\n",
"- Hence, you can input the full dataset\n",
"- The default errorbar is 95% ci, but you could set it to another size, or to *sd* or to *none*\n",
"- The default estimator plotted is the mean, but this can also changed to any summary function.\n",
"- The *kind* parameter can be set to {point, bar, count, box, violin, strip}. But you can also call the base function, e.g. boxplot() (see example below)\n",
"- Seeing that seaborn is built on top of matplotlib, you can always further customize plots using matplotlib methods (see example below).\n"
]
},
{
"cell_type": "code",
"execution_count": 49,
"metadata": {},
"outputs": [],
"source": [
"# we could define a function for saving plots for use outside of notebook (e.g. in paper)\n",
"def save_fig(fig, figname):\n",
" if not os.path.exists('figs'):\n",
" os.makedirs('figs')\n",
" fig.savefig(\"figs/%s.pdf\" % figname, dpi=300) #high dpi for printing\n",
" fig.savefig(\"figs/%s.png\" % figname, dpi=300)\n",
" fig.savefig(\"figs/%s.svg\" % figname, dpi=300)"
]
},
{
"cell_type": "code",
"execution_count": 59,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"sns.set_context(\"poster\", font_scale=1.3)\n",
"sns.set_palette('deep') # options: deep, muted, bright, pastel, dark, colorblind\n",
"\n",
"fig, ax = plt.subplots(figsize=(10, 6))\n",
"conditions = ['selAttGlob', 'selAttLoc']\n",
"\n",
"for i, condition in enumerate(conditions):\n",
" condition_data = dfIF[(dfIF['cond'] == condition)]['interference']\n",
" sns.distplot(condition_data, label=condition);\n",
" ax.axvline(x=dfIF[(dfIF['cond'] == condition)]['interference'].mean(), linestyle='--', color= sns.color_palette()[i])\n",
"\n",
"# embellish plot\n",
"sns.despine()\n",
"\n",
"ax.set_title('Navon interference on reaction times')\n",
"ax.set_xlabel(\"Interference\")\n",
"\n",
"# Improve the legend \n",
"handles, labels = ax.get_legend_handles_labels()\n",
"ax.legend(handles, ['local interference', 'global interference'], loc=\"best\");\n",
"save_fig(fig, \"interference\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"For more customization options, see the [seaborn tutorials](https://seaborn.pydata.org/tutorial.html). More flexibility is provided by the matplotlib core: [a cheat sheet](https://nbviewer.jupyter.org/urls/gist.githubusercontent.com/Jwink3101/e6b57eba3beca4b05ec146d9e38fc839/raw/f486ca3dcad44c33fc4e7ddedc1f83b82c02b492/Matplotlib_Cheatsheet)."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Let's do a quick t-test..."
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"t-test for global interference different from zero:\n",
"t = 14.92 p = 0.0\n",
"t-test for local interference different from zero:\n",
"t = 8.38 p = 0.0\n"
]
}
],
"source": [
"from statsmodels.stats.weightstats import ztest\n",
"\n",
"out = ztest(dfIF[dfIF.cond=='selAttLoc']['interference'], value=0)\n",
"print \"t-test for global interference different from zero:\\nt = \", round(out[0],2), \"p = \", round(out[1],4)\n",
"out = ztest(dfIF[dfIF.cond=='selAttGlob']['interference'], value=0)\n",
"print \"t-test for local interference different from zero:\\nt = \", round(out[0],2), \"p = \", round(out[1],4)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Luckily these conclusions are consistent with those reported in the paper..."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Or a mixed model..."
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" Mixed Linear Model Regression Results\n",
"======================================================================================\n",
"Model: MixedLM Dependent Variable: rt \n",
"No. Observations: 71620 Method: REML \n",
"No. Groups: 258 Scale: 0.0136 \n",
"Min. group size: 158 Likelihood: 51605.4400\n",
"Max. group size: 386 Converged: Yes \n",
"Mean group size: 277.6 \n",
"--------------------------------------------------------------------------------------\n",
" Coef. Std.Err. z P>|z| [0.025 0.975]\n",
"--------------------------------------------------------------------------------------\n",
"Intercept 0.529 0.004 142.079 0.000 0.522 0.537\n",
"congruence[T.incongruent] 0.013 0.001 10.854 0.000 0.011 0.016\n",
"cond[T.selAttLoc] 0.009 0.001 7.125 0.000 0.006 0.011\n",
"congruence[T.incongruent]:cond[T.selAttLoc] 0.011 0.002 6.556 0.000 0.008 0.015\n",
"groups RE 0.003 0.003 \n",
"======================================================================================\n",
"\n"
]
}
],
"source": [
"md = smf.mixedlm(\"rt ~ congruence * cond\", dfrt, groups=data[\"participant\"])\n",
"mdf = md.fit()\n",
"print(mdf.summary())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Accuracy analysis"
]
},
{
"cell_type": "code",
"execution_count": 46,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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119/1bBhw1zeU9W7d28VFxertrZWL774ogICAkystGPa2s/Fixerd+/estlsWr16te644w5NnjzZ7LI77Er72djYqA0bNig1NVUhISEqKirSH3/8odGjR5tccefRnXqfvqfvgWti9mX73UFpaanx0EMPGRaLxUhMTDTy8vKMQ4cOGYZhGPX19caCBQuMpKQkY/jw4cby5ctNrvbaLFmyxIiNjTV+/vnnZnNZWVnGokWLTKjKvVrbT8MwjNraWuP22283SktLTazSPVraz6amJuP111830tLSjKFDhxpz58416urqTKyy8+ouvU/f0/dAR/kZRhf6fSEAAADwGbxHFAAAAKYgiAIAAMAUBFEAAACYgiAKAAAAUxBEAQAAYAqCKAAAAExBEIVP+fLLLxUbG6uGhgZJ0siRI1VSUiJJunDhgrZt2+Y8durUqXr55ZdNqROAe9H7QNcUaHYBgCdt27ZNYWFhkqQNGzaooqJCEydOlCStXLlSQUFBZpYHwEPofaBrIIjCp0VERDj//v8/u6FXr17eLgeAl9D7QNfAS/PwitOnTys/P1/x8fEaMWKEli1bpqamJp0/f17//Oc/lZycrPj4eM2ePVunT592njdy5Eht3rxZU6ZM0Z133qkxY8Zo3759zvnffvvNebsZGRk6dOiQy/3+9fLcjh07tGrVKh08eFCxsbGSmr88t2vXLmVlZemuu+5SZmam9uzZ45xbuXKlnnrqKS1evFiJiYmyWCx66aWX1NTU5KkvGeAT6H0ArSGIwuPsdrsef/xxORwOlZSU6NVXX9UHH3yg9evXa86cOaqqqtKKFStUUlKihoYGzZw5U42Njc7zV6xYoZycHJWVlSk2NlYLFy6Uw+GQJM2ZM0f19fUqKSnRc889p/Xr17dYw9ixYzV9+nQNGTJEn332WbP50tJSWa1WTZs2TR988IEmTJigefPm6eDBg85j9u7dK5vNpq1bt2rRokXasmWLPvnkE/d+sQAfQu8DaAtBFB5XWVmpX375RUuXLlVcXJwSExNVUFAgm82myspKLVmyRAkJCYqLi1NxcbGqq6tdvsmPGzdOY8eOVf/+/ZWfn68zZ86opqZGR48e1TfffKPCwkLFxcUpNTVV+fn5LdYQEhKisLAwBQYGKjIystn8xo0bNXnyZE2aNEnR0dHKy8vT6NGj9eabbzqPCQsL0/PPP6/o6GhlZ2crLi5O3377rdu/XoCvoPcBtIUgCo87duyY+vXrp/DwcOfYqFGjFBMTo5CQEMXFxTnHw8PDFR0drePHjzvHoqKinH/v2bOnJMnhcOjYsWMKCwtzmb/zzjs7VOPx48d19913u4wlJCTo2LFjzn/fdtttLhc49OzZU5cuXerQ/QHdAb0PoC0EUXjcla5O7dGjR4vjjY2NLi/PtXS+YRjy8/Nr9j6tjl4J21ItTU1NLrd/pToAtIzeB9AWgig8LioqSqdOnVJ9fb1z7O2339amTZtks9l0+PBh5/jvv/+un376SdHR0W3e7uDBg2Wz2fTDDz84x7777rsrHu/n53fFuZiYGB04cMBlrKqq6qrqANAyeh9AWwii8Ljk5GT17dtXVqtVR48e1f79+/X6668rLS1N6enpWrBggaqqqnT48GE9/fTTioyMVGpqapu3GxMTo5SUFC1cuFDfffed9u/fr1WrVl3x+LCwMJ05c0bV1dXN5vLy8vTOO+/ovffe08mTJ/XWW2+pvLxcjz322DWtHejO6H0AbSGIwuMCAgK0Zs0aXbx4URMnTtSzzz6rSZMmKTc3V0VFRYqNjdUTTzyhnJwcXXfdddq8ebNCQ0Ov6rZfeeUVDRgwQFOmTJHValVubu4Vjx09erQCAwOVlZWl2tpal7lRo0Zp4cKFWrt2rbKysrRr1y6tWLFC995777UsHejW6H0AbfEzeKMLAAAATMAzogAAADAFQRQAAACmIIgCAADAFARRAAAAmIIgCgAAAFMQRAEAAGAKgigAAABMQRAFAACAKf4XSnD9USmaReMAAAAASUVORK5CYII=\n",
"text/plain": [
"
"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"sns.factorplot(x=\"condition\", y=\"acc\", hue=\"congruence\",\n",
" col=\"cond\", unit=\"participant\", data=df, kind=\"point\");"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Incidentally, it is possible to use latex in your markdown, for example, drop that Bayes!\n",
"\n",
"\\\\( P(A \\mid B) = \\frac{P(B \\mid A) \\, P(A)}{P(B)} \\\\)\n",
"\n",
"Just kidding, I'm not going to show you how to do a Bayesian analysis on these data...\n",
"\n",
"### I would like to do a logistic mixed model on the accuracy data, but unfortunately statsmodels does not yet support those.\n",
"\n",
"Statsmodel has an alternative method to deal with clustered data: Generalized Estimating Equations (GEE). GEEs have a few attractive advantages over hierarchical linear models (“mixed models”), for example fewer assumptions about the random effects and more intuitive interpretation of coefficients. Especially for discrete dependent variables (i.e., our binary accuracy data) the likelihood-based mixed models can show difficult convergence and a lack of robustness to misspecification of the covariance structure. See also: McNeish, D., Stapleton, L. M., & Silverman, R. D. (2016). [On the Unnecessary Ubiquity of Hierarchical Linear Modeling. Psychological Methods](https://drive.google.com/open?id=0BwlD7q-DXkdWWXRWRG5YZUZ1elU)."
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" GEE Regression Results \n",
"===================================================================================\n",
"Dep. Variable: acc No. Observations: 82200\n",
"Model: GEE No. clusters: 266\n",
"Method: Generalized Min. cluster size: 200\n",
" Estimating Equations Max. cluster size: 400\n",
"Family: Binomial Mean cluster size: 309.0\n",
"Dependence structure: Exchangeable Num. iterations: 8\n",
"Date: Fri, 25 May 2018 Scale: 1.000\n",
"Covariance type: robust Time: 16:22:30\n",
"===============================================================================================================\n",
" coef std err z P>|z| [0.025 0.975]\n",
"---------------------------------------------------------------------------------------------------------------\n",
"Intercept 2.5646 0.049 51.960 0.000 2.468 2.661\n",
"cond[T.selAttLoc] 0.2534 0.057 4.446 0.000 0.142 0.365\n",
"congruence[T.incongruent] -0.2408 0.048 -4.998 0.000 -0.335 -0.146\n",
"cond[T.selAttLoc]:congruence[T.incongruent] -0.3669 0.072 -5.126 0.000 -0.507 -0.227\n",
"==============================================================================\n",
"Skew: -3.0706 Kurtosis: 7.4768\n",
"Centered skew: -2.9520 Centered kurtosis: 7.1066\n",
"==============================================================================\n",
"The correlation between two observations in the same cluster is 0.023\n"
]
}
],
"source": [
"# model formulation\n",
"fml = \"acc ~ cond * congruence\"\n",
"\n",
"# covariance structure\n",
"ex = sm.cov_struct.Exchangeable()\n",
"#link fu\n",
"fa = sm.families.Binomial(sm.families.links.logit)\n",
"\n",
"model = sm.GEE.from_formula(fml, \"participant\", df, cov_struct=ex, family=fa)\n",
"result = model.fit()\n",
"print(result.summary())\n",
"print(result.cov_struct.summary())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### But reviewer #2 demands a conventional GLMM...so let's use R"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Interfacing between R and python\n",
"\n",
"### Option 1: R interface to python \n",
"- Using library([reticulate](http://blog.rstudio.com/2018/03/26/reticulate-r-interface-to-python))\n",
"- Add python code chunks in your Rmarkdown (but no autocomplete so best used sparingly)\n",
"- Read in python source files and call its functions\n",
"- Automatic variable conversion: e.g. R dataframe becomes pandas dataframe (and vice versa)\n",
"- Import python modules from within R and call its functions in the usual R way ($)\n",
"\n",
"### Option 2: Open the R kernel in jupyterlab\n",
"- Same environment but separate analyses\n",
"- Actual R notebook (jupyte**R**!)\n",
"- No real integration: you still rely on writing/reading files\n",
"\n",
"### Option 3: Python interface to R\n",
"- Using [rpy2](https://rpy2.readthedocs.io/en/version_2.8.x/) library (*conda install rpy2* into the Anaconda terminal)\n",
"- Make a full cell (or a line) of R (by \"magic\")\n",
"- Automatic variable conversion: Pandas dataframe becomes R dataframe (and vice versa)\n",
"- Load R libraries"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [],
"source": [
"import rpy2.rinterface\n",
"\n",
"%reload_ext rpy2.ipython\n",
"%R -n require(lme4); \n",
"%R -n require(tidyr); require(ggplot2)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"A killer feature of Jupyter notebooks are **magic commands**. \n",
"\n",
"- These commands, prefaced with a '%', add some extra power over top of the typical Python syntax to solve common problems that may arise. [More about magic commands](http://ipython.readthedocs.io/en/stable/interactive/magics.html). We focus on R here but Magic commands are for example also available for javascript plotting in Jupyter.\n",
"- *%load_ext* magic command loads the rpy2 jupyter extension into the notebook, essentially initializing the R interface and allowing the notebook to connect and pass objects between the two languages. This magic command needs only to be run once. \n",
"- Double \"%\" signs affect the whole cell (jupyter code block), for example making it an R code block. "
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAeAAAAHgCAIAAADytinCAAAeBElEQVR4nO3de1TUdf748fdcuI6IYGojeUNGdNXAI3jtiJqn0OOF8lK05a76XRY3zdXT6q6b2Z6Obufo6rZbXspvWnpsrTUveUzUb2q6qRVZhgmieIsA8QIyowPMzOf3x/gzQjBq4/N5MTwff8FnPsz7NUrPPr4ZZkyapikAgDxmowcAANSNQAOAUAQaAIQi0AAgFIEGAKEINAAIRaABQCgCDQBCEWgAEIpAA4BQBBoAhCLQACAUgQYAoQg0AAhFoAFAKAINAEIRaAAQikADgFAEGgCEItAAIBSBBgChCDQACEWgAUAoAo2fn8PhMNVgNpu7du36yiuvNPweXC6XyWQKCwv7yTN4vV7/6j/qq+x2e82xO3XqNGPGjOvXrzf8Hv77yYHbCDQaS5cuXRITExMSEsxmc0FBwcyZMw8ePPizr9KnTx+TyZSdnf0z3mdcXFxiYqLD4bh48eKrr746c+ZM/WcAFIFG41m+fPmxY8e++OKLo0eP3nPPPUqp3bt367a6xWJxu91ut/snfO2aNWuOHTuWl5e3ceNGpdQ777zj8/l+7gGBH0ag0ej69u2bkpKilAoPD695PD8/3+FwPPzww6+99lqXLl06duw4d+5cj8dz5z04nc7Zs2c7HI6IiIi+ffu++eab/uN9+vT54osvlFJJSUmbN2+u+SUulys0NLRVq1ZKqcuXLzscjn79+m3durV3796RkZFpaWmlpaU/OPmDDz6olHK73eXl5WPGjDGZTC+++KL/ppdeeslkMs2ePbu+GbKyshISEiIjIx977LHbmyT1PZCfPCECnAb83OLi4pRSW7du9X9aWFjYpUsXpdShQ4dqnpaTk6OUCg0NtdlsQ4cObdmypVJq1qxZmqY5nU7/Tf4zhw8frpTq2LHj6NGj/ZV/+eWXNU3btWtXp06dlFKLFi26ePFizTuveQ/FxcVKKavVGhISkpiYaLValVIZGRl3Tn7vvfcqpfbv3+//9N///rdSKjIyUtO0t99+WynVr18//01DhgxRSh05cqTWDP51zWZzWFhYQkKCxWJRSs2fP//uD6ThE6JZIdD4+fkDXZPFYlm4cGGt0/yBVkp9+OGHmqYdP37cbDaHhIRUVFTUzOuBAwf8UauoqLj9aevWrf13kpiYqJT67LPPat35nYG+Xd7169crpe6///47J/cHOj4+PikpqWfPnmazWSn17LPPaprmcrlatGhhMpmKiorKysqsVmvnzp3vnMG/rlJqx44dmqb97W9/U0oNHz787g+k4ROiWbH+99fgQJ26dOkSGRnp8/lyc3OrqqpOnTqladqdT6to167dsGHDlFK9e/fu1avX8ePHT58+7XA4bp9w/PhxpdSYMWNatGihlBoyZIjdbi8qKioqKrLb7Q2fp1WrVv6dlqSkJKXUjRs36jszLy/P/0H79u0nTZrk39YIDw9PS0vbsGHDzp07IyMjPR7P448/Xt89BAcHjxo1SimVnJx8e627PBD//wkaPiGaCfag0Vj8PyT88ssvz549a7FY3n777cuXL995Ws1k3+VZcTVv8ueszt3qu/DvG9x9Fb/bWxyFhYXLly8PDQ31H//lL3+plHr//fc/+OADpdRdAm02m/2r+Edt4ANp+IRoJgg0Gl379u39l7qXLl2689bi4mL/0+9ycnJycnJCQ0O7detW84RevXoppXbs2OFyuZRShw4dKiwsjI6O7tChw+1zvF5voz4EvxEjRrRt23bPnj07d+6Mj49PSEioeesPztCQBwLURKChn9s7rTVZLJaRI0c+9NBDDzzwgNfrfeaZZ2o92WPo0KEpKSnnzp27//77H3300ZEjRyqlXnjhBf+tt3/Ulp+f39jzW63WSZMmuVyuoqKi9PT028cbOMPdHwhwJwINPXTt2lUptXXr1jtviouLmz9/fk5OTkRExPz58xcvXnznOe+///4zzzxjMpl2797tcDjWrVt3+5dHnnnmmbZt227atOnEiRON+hD8nnjiCf8Hjz322O2DDZ/hLg8EuJNJ0zSjZ0AzdeLEiV69enXv3v3kyZNGz9JQ33zzTYcOHRITE48dO2b0LAh8XEEDDfX666+PGzdOKTVlyhSjZ0GzQKCBhtq4cWNxcfFTTz2VkZFh9CxoFtjiAAChuIIGAKEINAAIRaABQCgCDQBCEWgAEIpAA4BQBBoAhCLQACAUgQYAoQg0AAhFoAFAKAINAEIRaAAQikADgFAEGgCEItAAIBSBBgChCDQACEWgAUAoq9ED/DiXL1/et2+f0VMAwC1ms3ns2LFBQUGNcedNLNAffvjhtm3bUlJSjB4EAJRS6q233kpMTOzatWtj3HkTC7RSavDgwbzpPQAhPvnkk8a7c/agAUAoAg0AQhFoABCKQAOAUAQaAIQi0AAgFIEGAKGa3vOgAaCRuK9o1S5NKVXt0oJsJqVU+L1mS7Bh8xBoALhlX+aNVg6zt1JdyvbYB1nLC3zdHg+OTWuUX+NuCAINALeYrWrg4jD3Fe3owpsDF4flb6rSNCPnIdAAcIv7qpazqtJzQ5Wf8eWsqrz8pbdNXyMjyQ8JAeAWa6hq3dsS1cMcEmlq3dvS4j6zNczIeQg0ANxiDTfZB1vb9bOG3mOyD7ZGxpmt4SYj5zFwbQAQxWRRu590+Tyq4rxv95Oum6VanzkhBs5DoAHgloc22Iwe4XvY4gAAoQg0AAhFoAFAKAINAEIRaAAQikADgFAEGgCEItAAIBSBBgChCDQACGVAoK9evepyufRfFwCaFj0CPWbMGLfbrZTKz89PSkpq06ZNVFRUampqcXGxDqsDQBOlR6B37Njh9XqVUpmZmSNGjHC5XE6nc+DAgTNmzNBhdQBoonR9NbvPP/88KyvLarUqpRYsWGC32/VcHQCaFp32oEtKSpRSsbGx58+f9x/Jzc31lxoAUCc9Aj1kyJCUlJSIiIiCgoKnn35aKbVv376UlJQ5c+bosDoANFF6XMMeOHBAKVVZWXn27Nny8nKlVEhIyKZNm4YPH67D6gDQROm3yRASEtK9e3f/x4MGDfrB8zdv3rxq1apaB/Pz8+Pj43/3u9/9/PMBgDByd4HHjx8/fvz4Wgdnz55dVFRkyDwAoDM9Ap2Xl1ffTfHx8ToMAABNkR6BnjVrVlZWVlhYWGRkZK2buBwGgProEehdu3ZlZmaaTKaVK1fqsBwABAadngednp7epUsXfdYCgMCg0w8JU1JSUlJS9FkLAAIDLzcKAEIRaAAQikADgFAEGgCEItAAIBSBBgChCDQACEWgAUAoAg0AQhFoABCKQAOAUAQaAIQi0AAgFIEGAKEINAAIRaABQCgCDQBCEWgAEIpAA4BQBBoAhCLQACAUgQYAoQg0AAhFoAFAKAINAEIRaAAQikADgFAEGgCEItAAIBSBBgChCDQACEWgAUAoAg0AQhFoABCKQAOAUAQaAIQi0AAgFIEGAKEINAAIRaABQCgCDQBCEWgAEIpAA4BQBBoAhCLQACAUgQYAoQg0AAhFoAFAKAINAEIRaAAQikADgFAEGgCEItAAIBSBBgChCDQACEWgAUAoAg0AQhFoABCKQAOAUAQaAIQi0AAgFIEGAKEINAAIRaABQCgCDQBCEWgAEIpAA4BQBBoAhCLQACAUgQYAoQg0AAhFoAFAKAINAEIRaAAQikADgFAEGgCEItAAIBSBBgChCDQACEWgAUAoAg0AQhFoABCKQAOAUAQaAIQi0AAgFIEGAKEINAAIRaABQCgCDQBCEWgAEIpAA4BQBBoAhCLQACAUgQYAoXQNtKZpFRUVmqbpuSgANFF6BLqysnLhwoXdunULCQlp2bJlcHCww+F44YUXqqqqdFgdAJooPQKdkZFx/PjxtWvXlpSUVFdXX7p0af369Xl5eZmZmTqsDgBNlFWHNXbu3Hnx4sXQ0FD/p1FRUQMGDEhOTo6NjdVhdQBoovS4go6JicnKyqp18NChQ61bt9ZhdQBoovS4gn799dfHjRu3YMGCX/ziFxEREU6nMy8vr6SkZNu2bTqsDgBNlB6BTk5OvnDhwv79+8+ePXvt2rWoqKhp06YNHTrUar3b6ps3b161alWtg6dOnYqLi2vMYQFACj0CrZSyWq0jRoz4UV8yfvz48ePH1zo4e/bsoqKin28uAJCLX1QBAKH0uILOy8ur76b4+HgdBgCApkiPQM+aNSsrKyssLCwyMrLWTexXAEB99Aj0rl27MjMzTSbTypUrdVgOAAKDTnvQ6enpXbp00WctAAgMOj2LIyUlJSUlRZ+1ACAw8CwOABCKQAOAUAQaAIQi0AAgFIEGAKEINAAIRaABQKi6A33q1CmlVHV19Xvvvbd27drq6mp9pwIA1BXo559/vk+fPl6vd9myZQsWLFi9evWMGTP0nwwAmrk6Ar1ixYqcnByLxfLKK6+88cYbu3bt2rp1q/6TAUAzV0egNU1r1apVdna21+tNTk62Wq1VVVX6TwYAzVwdr8UxYcKEYcOGOZ3O2bNnX7lyZezYsQ888ID+kwFAM1dHoFesWLFlyxaPxzNhwoTS0tK0tLTp06frPxkANHN1BNpisUyYMMH/sd1unzdvnr4jAQCUqhXo5OTk+s779NNPG38YAMB3vhfoNWvWGDUHAKCW7wU6ISGhzpO2bNlS300AgEZSxx50Xl7e8uXLy8vL/Z86nc7CwsJHHnlE38EAoLmr43nQTz31lFLKbrcXFRWNHDmyoqLiueee030wAGju6riC/vrrrw8ePOjz+YYMGTJ58uRhw4ZNnDjx0Ucf1X84AGjO6riCbtmyZX5+flhYmM/nKywsjImJOXfunO6DAUBzV8cV9Lx585KTkwsKCsaNGzdy5Ei73d6jRw/9JwOAZq6OQM+aNWvixInR0dHPPfdcjx49ioqK/LvSAAA91RHo9PT09PT01NRUs9k8ceJE/WcCAKg696ATExP/+te/2u32adOm7d271+v16j8WAKCOQM+bN+/w4cMnTpzo37//8uXLY2NjZ86cqf9kANDM1fuehNHR0bGxsQ6HQ9O0PXv26DkTAEDVGei1a9dOmDChTZs28+fPb9euXVZWVm5urv6TAUAzV8cPCTdu3JiWlvbyyy/HxMToPxAAwK+OQNe3ofHss88uXbq0kecBANxS7x70nVwuV+PNAQCo5UcEGgCgpzq2OAA0Ezcva1//b6VSyvWtLyTKbA1TIVGmXhkhRs+FW7iCBpqvinO+yqta51FBlmBT616WzqOCzn9QbfRQ+A6BBpq1sLam1r0tYW1MkV3NrXtbrKEmoyfCd9jiAJov91Xf6XerCg94bhT7Luz2WMPVjWLN6KHwnTquoOfMmfOf//zH5/PVOj5r1ixdRgKgk9Boc9zE4NHbW8RNCB68JGz09haRXflXtSB1/GXYbLbMzMyYmJjp06fv3bvX4/H4j3fv3l3f2QA0uspyreKCr+q6dqPEV3HB56vmClqQOgL94osvfvXVVwcPHoyLi/vLX/5it9t//etfb9++3e126z8fgMbTooNJ86icVZXOQt+FLE/Oqsp7B7LtKUi9fxl2u93hcPTs2TMvL+/IkSNnzpyZOnXqypUreYVoIGCEtzMPXBxm9BSoVx2B/vvf/75z584jR470799/9OjRhw8f7tq1q1Lq2LFjY8aMIdAAoI86An38+PHMzMzNmzdHRETUPN67d+9XX31Vr8EAoLmrI9BvvPFG3adarePGjWvkeQAAt/CUGgAQikADgFAEGgCEItAAIBSBBgChCDQACEWgAUAoAg0AQhFoABCKQAOAUAQaAIQi0AAgFIEGAKEINAAIRaABQCgCDQBCEWgAEIpAA4BQBBoAhCLQACAUgQYAoQg0AAhFoAFAKAINAEIRaAAQikADgFAEGgCEItAAIBSBBgChCDQACEWgAUAoAg0AQhFoABCKQAOAUAQaAIQi0AAgFIEGAKEINAAIRaABQCgCDQBCEWgAEIpAA4BQBBoAhCLQACAUgQYAoQg0AAhFoAFAKAINAEIRaAAQikADgFAEGgCEItAAIBSBBgChDAj01atXXS6X/usCQNOiR6DHjBnjdruVUvn5+UlJSW3atImKikpNTS0uLtZhdQBoovQI9I4dO7xer1IqMzNzxIgRLpfL6XQOHDhwxowZOqwOAE2UVc/FPv/886ysLKvVqpRasGCB3W6/y8lHjhw5cOBArYOfffZZy5YtG3FEABBDp0CXlJTExsbGxsaeP3++a9euSqnc3Fx/qevToUOHvn371jp45cqV8PDwRhwUAMTQI9BDhgxJSUkpKyuzWq1PP/30rl279u3bN2nSpD/+8Y93+aqYmJiYmJhaB69evXr58uXGHBYApNAj0P6disrKyrNnz5aXlyulQkJCNm3aNHz4cB1WB4AmSr896JCQkO7du/s/HjRokG7rAkATxS+qAIBQBBoAhCLQACAUgQYAoQg0AAhFoAFAKAINAEIRaAAQikADgFAEGgCEItAAIBSBBgChCDQACEWgAUAoXd/yCjBczurKbw96lFLOi74WHcxKqe6Tgzs+FGT0XEAduIJG83L5S2/KP8Mf2mCztTc/tMHWKyOk/LTP6KGAunEFjeZF86mq65rJrHweVVWueVya0oyeCagHgUbz4rzo+8/cm+YgVZbv3f/0jcoyLfoXFqOHAupGoNG8RHQyD1wUFhJlykp3PbTB9u1Hnis5XqOHAupGoNHsXNhTHdTC5L6qndtZfe2k1xpmMnoioG78kBDNS48pwZpXVZVr9w2zVpVrtvbmjg/zFA4IxRU0mpd2ydZ2yUYPATQMV9AAIBSBBgChCDQACEWgAUAoAg0AQhFoABCKQAOAUAQaAIQi0AAgFIEGAKEINAAIRaABQCgCDQBCEWgAEIpAA4BQBBoAhCLQACAUgQYAoQg0AAhFoAFAKAINAEIRaAAQikADgFAEGgCEItAAIBSBBgChCDQACEWgAUAoAg0AQhFoABCKQAOAUAQaAIQi0AAgFIEGAKEINAAIZTV6ADSuymta1hMuc5Cquq6ZLCrIZtJ8avTWFib+5gHx+M80wFXf0KJ7Wh5YGpb7VlXoPabOo4L2/Mrl8ymL0YMB+EEEOvB5bmgVF3zua5qmVMUFn7dSM3oiAA1CoAOcx61dy/PlrKosO+WzhKmyXK/zok+RaKApINABzhpqatPHMnBxzS0OnzIZPRaABiDQga8sz5uzqrL0c6/VppwXfM6LPqMnAtAgBDrA2e413z8jxOdVwVEms0VZw03JC8IswUaPBaABCHSAM1lUx4eDjJ4CwE/BL6oAgFAEGgCEItAAIBSBBgChCDQACEWgAUAoAg0AQhFoABCKQAOAUAQaAIQi0AAgFIEGAKEINAAIFYCvZnf1pPfyF16lVMUFX0RHs1KqTR9LVHfehA9AExOAV9Bn/l3t+tanlLqwu1opdfOSlrexyuihAOBHC8BAK6U6jQzqlh4c3tbcLT240yheDRlAkxSAWxzXz/my/+oObmkqy/ceePpGlVMpjTdJBdD0BGCgIzqaO420RsVb/u9/bgxcHFZ+xnf6PbY4ADQ9AbjFYTKroBam4EiT2aqCI01BESZTAD5KAIEvAK+gW8WbP1vsVko5C327n3QppTqzDQ2gCQrAQDsmBTsm8bbVAJo8/vEPAEIRaAAQikADgFAEGgCEItAAIBSBBgChCDQACEWgAUCoJvaLKpGRkYsXL96yZUtDTv7kk0+s1ib2ABtPdXW1yWTiD+S2GzduhIeHGz2FFJWVlVar1WLhZdOVUkrTNIvFkpiY2JCTL168GBYW1kiTmLTAfaW3YcOG7du3z+gppHj11Vfbtm07ceJEoweRgm+Pmv70pz+NGzduwIABRg8iwqVLl2bOnLlp0yajB2GLAwCkItAAIBSBBgChCDQACEWgAUCoQA40TymryWKx8CSqmvj2qMlsNpvNgVyDH0XOn0YgP82uoqIiIiLC6CmkcLvdFoslKIg3l7mFb4+aXC5XeHi4yWQyehAphHx7BHKgAaBJE3EZDwC4E4EGAKEINAAIRaABQCgCDQBCEWgAEIpAA4BQgRzo/v375+XlGT2F8TZv3tytW7eoqKjhw4fn5uYaPY7xVq9e3alTp6ioqLFjx5aWlho9jggnTpyIjIw0egoRUlJSTP/fmDFjjB0mMAP90UcfZWRkfPLJJ0YPYrzi4uKpU6euW7fuypUrqampEyZMMHoig506dWrOnDl79+49c+aMpmnPP/+80RMZz+v1TpkypaqqyuhBRCgoKDhz5ozT6XQ6ne+++66xwwRmoI8cOWKxWBrvfWiakCNHjiQlJQ0aNMhsNs+ePfvkyZNlZWVGD2Wko0ePDh482OFwREdHT548+cSJE0ZPZLwlS5Y4HA6jpxChsrKyrKwsNjbWZrPZbLbQ0FCDB9IC17333pubm2v0FAZzOp1Xrlzxf/zhhx/GxsYaO48QHo/nxIkTkydPnj9/vtGzGOzrr7/u2bPnmTNnQkNDjZ7FeCdPnmzVqlXfvn1btWr14IMP5ufnGztPYF5B4zabzRYdHa2U2rZtW3p6+pIlS4yeSITt27f369dv7969M2fONHoWI/l8vmnTpq1YscJmsxk9iwjl5eX9+vX717/+denSpb59+6anpxs7TyC/WJLdbt+/f398fLzRgxjs2rVrGRkZOTk5a9asGTx4sNHjSFFVVfXmm2+uWLHi2LFjRs9imGXLlp09e/af//xnSUlJ586db968afREgrjdbpvNVlpa6r/EMQRX0AGuuro6NTW1bdu2x48fp85KqdWrV69fv14pFRwcPGnSpK+++srj8Rg9lGGOHTu2bt26iIiI2NhYt9sdERFx+PBho4cy0scff3z7vd7NZrPFYgkJCTFwHgId4LZt2+b1epctW+bz+SorKysrK42eyGBt27ZdsmTJ5cuXNU1buXJl//79m/Mr969fv76ioqKioqKgoCA0NLSiomLgwIFGD2Ukt9v92GOPnTx50ufzvfTSS8OGDTN286f5fms2E9nZ2dnZ2TV/GF1WVtacn/H6yCOPZGdnJyQkeDyevn37btiwweiJIMjw4cPnzp374IMPejyewYMHr1u3zth5AnkPGgCaNLY4AEAoAg0AQhFoABCKQAOAUAQaAIQi0AAgFIEGAKEINAAIRaABQCgCDQBCEWgAEIpAA4BQBBoAhCLQACAUgQYAoQg0AAhFoAFAKAINAEIRaAAQikCjyfv4449tNlt+fr7/05KSkujo6J07d/439/nll18mJyf/HNMBPx2BRpM3aNCgjIyM3/72t/5Pf//736elpY0aNcrYqYD/HoFGIFi0aNGFCxfWrl27c+fOQ4cOLV++vL4zR4wYsW7dOv/HL7300hNPPKGU+sc//nHfffdFREQMGDDg1KlTNc/3er3Tp09v06ZNmzZtFi5c2JgPAqiNQCMQhIeHr1mz5g9/+MP06dNfe+21yMjI+s585JFHduzY4f9427Ztjz/++Lfffjtv3rwPPvigtLQ0ISFh2bJlNc/fsmXL4cOH8/Lyjh49unTp0lr5BhoVgUaAGDp0qN1uDwkJSU1NvctpaWlpe/bsqaqqKi4uPnXqVGpqauvWrQsKCnr37q1pWosWLcrLy2ue7/F4nE7nuXPnYmNjr1+/3q1bt0Z+HMB3CDQCxGuvvaZpms1me+WVV+5yWkxMTHx8/EcffbR9+/a0tLTg4OCgoKA1a9YkJSUNGTIkOzu71vkTJkz4zW9+M3r06I4dOy5btqy6uroxHwTwPQQageD8+fNz585ds2bN66+//uc///n06dN3Odm/y7Ft27b09HSl1ObNm999992tW7d++umnU6dOrXVyaWnp1KlTv/nmm3feeWfdunXvv/9+Iz4M4PsINJo8TdOmTp36q1/9asCAAUlJSdOmTZsyZYrP56vv/LS0tPfeey8nJ2fYsGFKqaKiovbt27dv3/7ixYtr1651Op01T37rrbfGjh178+bNHj16RERE1NoAARoVgUaTt3LlytOnTy9atMj/6YsvvnjhwoWXX365vvN79OgRHh4+duxYi8WilHryySfdbnf79u0nTpw4c+bMwsLCLVu23D45MzOzdevWMTExcXFxvXv3fvLJJxv74QC3mTRNM3oGAEAdrEYPADSK3NzcOy+ibTbb0qVLDZkH+Am4ggYAodiDBgChCDQACEWgAUAoAg0AQhFoABCKQAOAUAQaAIQi0AAgFIEGAKEINAAIRaABQCgCDQBCEWgAEIpAA4BQBBoAhCLQACDU/wMDyxDqEjevugAAAABJRU5ErkJggg==\n"
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"%%R\n",
"# ^ Tells the notebook that this code cell is actually R\n",
"\n",
"# Now we can write R code as if this were an R notebook\n",
"X_vals <- c(1, 2, 3, 4, 5)\n",
"y_vals <- c(1, 2, 4, 8, 16)\n",
"\n",
"plot(X_vals, y_vals,\n",
" col='purple', pch=12,\n",
" main='R plot in Python')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Passing variables back and forth\n",
"\n",
"- A variable listed after -i on the %%R line will be inputted and converted to an R object from Python. \n",
"- A variable listed after -o on the %%R line will be outputted and converted from an R object to a Python object."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"ename": "NameError",
"evalue": "name 'np' is not defined",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrandom\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mseed\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m42\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0;31m# Make a pandas DataFrame\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mtestdf\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpd\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mDataFrame\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrandom\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnormal\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0msize\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m100\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m3\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcolumns\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mlist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'ABC'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mtestdf\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'C'\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtestdf\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'C'\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mtestdf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mhead\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mNameError\u001b[0m: name 'np' is not defined"
]
}
],
"source": [
"np.random.seed(42)\n",
"# Make a pandas DataFrame\n",
"testdf = pd.DataFrame(np.random.normal(0,1,size=(100, 3)), columns=list('ABC'))\n",
"testdf['C'] = testdf['C'] + 2\n",
"testdf.head()\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n"
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"%%R -i testdf\n",
"testdf %>% \n",
" gather(\"Category\", \"X\") %>%\n",
" ggplot(aes(x = Category, y = X, fill = Category)) +\n",
" geom_violin() +\n",
" stat_summary(fun.y=mean, color='black', geom='point', size = 3) +\n",
" theme_bw()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### But why not stay in python ;-)"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" category X\n",
"0 A 0.496714\n",
"1 A 1.523030\n",
"2 A 1.579213\n",
"3 A 0.542560\n",
"4 A 0.241962\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"dfmelted = pd.melt(testdf, value_vars=[\"A\",\"B\",\"C\"], var_name=\"category\", value_name=\"X\")\n",
"print dfmelted.head()\n",
"dfmelted[\"xbin\"] = dfmelted.X > .5\n",
"\n",
"sns.violinplot(x=\"category\", y=\"X\", data=dfmelted, inner=\"quart\");"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Note that we used the pandas melt function to go from a dataset in the wide form (testdf above) to long form (done in R with the melt or gather function). There are many more **reshaping and pivoting** functions in pandas, which we won't cover. The best way to get a feel for the pandas reshape and pivot functions is to go through [this brief visual guide](https://jalammar.github.io/visualizing-pandas-pivoting-and-reshaping/). Further details can be found in the [pandas documentation](https://pandas.pydata.org/pandas-docs/stable/reshaping.html)."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Still prefer the ggplot syntax?"
]
},
{
"cell_type": "code",
"execution_count": 60,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"