#Homework 5
#Ethan Witkowski
import pandas as pd
import matplotlib.pyplot as plt
import scipy.stats as st
import numpy as np
from psychopy import visual, core, event
from os import listdir
from functools import partial
import random as rnd
import os
#Import memory experiment data
#Create list of files
files = [f for f in listdir("C:\\Users\\ethan\\Desktop\\Swarthmore\\Fall 2019\\Scientific Computing\\Homework Assignments\\HW5\\PSYC027_INTEGRATE_data\\PSYC027_INTEGRATE_data") if f.endswith('.txt')]
#Function to separate fields by tabs
mapfunc = partial(pd.read_csv, sep ='\t')
#Concatenate into dataframe, re-index
data = pd.concat(map(mapfunc, files), ignore_index=True)
#Outlier exclusion criteria
SD_thres = 5
#Array of zscore values for each trial
zscores = st.zscore(data.RT)
#List of unique subjects
unique_subjects = [f for f in set(data.SubjectNumber)]
#Response time priming effect for each group for b,nb,baseline
#Declare lists
priming_b = []
priming_nb = []
priming_baseline = []
#Declare sub-list for each unique subject
for i,subject in enumerate(unique_subjects):
priming_b_subject = []
priming_nb_subject = []
priming_baseline_subject = []
for ctr,subj in enumerate(data.SubjectNumber):
if subj == subject:
#Pass first trial
if ctr==0:
pass
else:
#Check conditions for current iteration
validcurrent = (data.PairType[ctr] == 'P23', data.PrimeType[ctr] == 'P2', data.Accuracy[ctr] == 1, zscores[ctr] < SD_thres)
validcurrent = np.all(validcurrent)
#Check conditions for next iteration
validprev = (data.PairType[ctr-1]=='P23' and data.PrimeType[ctr-1]=='P1' and data.Accuracy[ctr-1]==1 and zscores[ctr-1] < SD_thres)
validprev = np.all(validprev)
if validcurrent & validprev:
if data.BoundaryType[ctr]=='B' and data.BoundaryType[ctr-1]=='B':
priming_b_subject = np.append(priming_b_subject,data.RT[ctr]-data.RT[ctr-1])
elif data.BoundaryType[ctr]=='NB' and data.BoundaryType[ctr-1]=='NB':
priming_nb_subject = np.append(priming_nb_subject,data.RT[ctr]-data.RT[ctr-1])
else:
validbaseline = data.ItemOldNew[ctr]=='old' and data.ItemOldNew[ctr-1]=='old' and \
data.Accuracy[ctr]==1 and data.Accuracy[ctr-1]==1 and zscores[ctr] < SD_thres and zscores[ctr-1] < SD_thres
if validbaseline:
priming_baseline_subject = np.append(priming_baseline_subject,data.RT[ctr]-data.RT[ctr-1])
priming_b.append(priming_b_subject)
priming_nb.append(priming_nb_subject)
priming_baseline.append(priming_baseline_subject)
#Find mean response time for each subject in each subject (Boundary, Non-Boundary, Baseline)
#Boundary
mean_priming_b = np.empty([len(priming_b)])
for i,subject in enumerate(priming_b):
mean_priming_b[i] = np.mean(subject)
print(mean_priming_b)
#Non-Boundary
mean_priming_nb = np.empty([len(priming_nb)])
for j,subject2 in enumerate(priming_nb):
mean_priming_nb[j] = np.mean(subject2)
print(mean_priming_nb)
#Baseline
mean_priming_baseline = np.empty([len(priming_baseline)])
for k,subject3 in enumerate(priming_baseline):
mean_priming_baseline[k] = np.mean(subject3)
print(mean_priming_baseline)
#Calculate mean response time priming effect across boundary, non-boundary, baseline
group_mean_priming_b = np.mean(mean_priming_b)
print(group_mean_priming_b)
group_mean_priming_nb = np.mean(mean_priming_nb)
print(group_mean_priming_nb)
group_mean_priming_baseline = np.mean(mean_priming_baseline)
print(group_mean_priming_baseline)
#Plot bar graph of priming effects across b, nb, bl
groups = ('Boundary', 'Non-Boundary', 'Baseline')
x_axis = np.arange(len(groups))
mean_priming = (group_mean_priming_b, group_mean_priming_nb, group_mean_priming_baseline)
plt.bar(x_axis, mean_priming, align = 'center')
plt.xticks(x_axis, groups)
plt.ylabel('Mean RT Priming Effect')
plt.title('Mean Priming Effects')
plt.show()
#T-test between Boundary, Non-Boundary mean priming effects
print('Given alpha = .05:')
print('')
stat_b_nb, pval_b_nb = st.ttest_rel(mean_priming_b, mean_priming_nb)
print('There is a significant difference between the boundary and non-boundary groups, \
given the p-value of ' + str(pval_b_nb))
print('')
#T-test between Boundary, Baseline mean priming effects
stat_b_bl, pval_b_bl = st.ttest_rel(mean_priming_b, mean_priming_baseline)
print('There is a significant difference between the boundary and baseline groups, \
given the p-value of ' + str(pval_b_bl))
print('')
#T-test between Non-Boundary, Baseline mean priming effects
stat_b_bl, pval_nb_bl = st.ttest_rel(mean_priming_nb, mean_priming_baseline)
print('There is no significant difference between the non-boundary and baseline groups, \
given the p-value of ' + str(pval_nb_bl))
#Read-in memory experiment data
mem_data = pd.read_csv('lecture15_catfr_retrieval_data.txt')
#Define words list
words = list(mem_data.word)
#Set number of targets
ntargets = input("Please input the number of targets: ")
ntargets = int(ntargets)
#Set number of lures
nlures = input("Please input the number of lures: ")
nlures = int(nlures)
mem_data.head()
#Randomly select targets and lures
#Choose random trials without replacement to be targets
targets = mem_data.sample(n=ntargets, replace=False)
#Choose random trials without replacement to be lures
lures = mem_data.sample(n=nlures, replace=False)
#Concatenate lures and targets
sample_mem_data = pd.concat([targets, lures], ignore_index=True)
#Insert column to hold target/lure value
sample_mem_data.insert(1, "type", list(range(len(sample_mem_data.word))))
#Populate column with target/lure values
for i,type_i in enumerate(sample_mem_data.word):
if type_i in list(lures.word):
sample_mem_data.type[i] = "lure"
elif type_i in list(targets.word):
sample_mem_data.type[i] = "target"
#Randomize sample memory dataframe
sample_mem_data = sample_mem_data.reindex(np.random.permutation(sample_mem_data.index))
sample_mem_data = sample_mem_data.reset_index(drop=True)
#Reset memory dataframe
mem_data = pd.read_csv('lecture15_catfr_retrieval_data.txt')
sample_mem_data.head()
#Pre-allocate arrays for data collected during experiment
#Pre-allocate numpy array of responses
responses = np.empty([1,len(sample_mem_data.word)], dtype = "object")
#Pre-allocate array of results
results = np.empty([1,len(sample_mem_data.word)], dtype = "object")
#Pre-allocate arry of old/new response
old_new = np.empty([1,len(sample_mem_data.word)], dtype = "object")
#Pre-allocate array of confidence
confidence = np.empty([1,len(sample_mem_data.word)], dtype = "object")
#Pre-allocate array of response times
RT = np.empty([1,len(sample_mem_data.word)], dtype = "object")
#Experiment
#Encoding phase
#Create window
win = visual.Window([400,400])
#Show target words to participant with 1-second delay
for target in targets.word:
stim = visual.TextStim(win,text=target.rstrip('\n'))
stim.draw()
win.flip()
core.wait(1)
#Intermediate phase
#Present window asking participant to input 'i' to move to test phase
stim = visual.TextStim(win,text='Please press "i" to move on to test phase.')
stim.draw()
win.flip()
pressedkey = event.waitKeys(keyList = ["i"])
if pressedkey[0] == 'i':
win.flip()
core.wait(1)
#Test Phase
for i,test_word in enumerate(sample_mem_data.word):
#If subject number is even
if int(sample_mem_data.subj[i][4]) & 1:
#Present word
stim = visual.TextStim(win,text=test_word.rstrip('\n'))
stim.draw()
win.flip()
#Gather response, response time
prestime = core.getTime()
pressedinfo = event.waitKeys(keyList=['1','2','3','4','5'], timeStamped=True)
#Collect response
responses[0][i] = pressedinfo[0][0]
#Collect response time
RT[0][i] = pressedinfo[0][1]-prestime
#Collect confidence
if pressedinfo[0][0] == '1' or pressedinfo[0][0] == '5':
confidence[0][i] = 'sure'
elif pressedinfo[0][0] == '2' or pressedinfo[0][0] == '4':
confidence[0][i] = 'unsure'
elif pressedinfo[0][0] == '3':
confidence[0][i] = "don't_know"
#Collect determination of old/new
if pressedinfo[0][0] == '1' or pressedinfo[0][0] == '2':
old_new[0][i] = 'new'
elif pressedinfo[0][0] == '4' or pressedinfo[0][0] == '5':
old_new[0][i] = 'old'
elif pressedinfo[0][0] == '3':
old_new[0][i] = 'unsure'
#Collect results
if (pressedinfo[0][0] == '4' or pressedinfo[0][0] == '5') & (sample_mem_data.word[i] in list(targets.word)):
results[0][i] = str("hit")
elif (pressedinfo[0][0] == '4' or pressedinfo[0][0] == '5') & (sample_mem_data.word[i] in list(lures.word)):
results[0][i] = str("false alarm")
elif (pressedinfo[0][0] == '1' or pressedinfo[0][0] == '2') & (sample_mem_data.word[i] in list(targets.word)):
results[0][i] = str("miss")
elif (pressedinfo[0][0] == '1' or pressedinfo[0][0] == '2') & (sample_mem_data.word[i] in list(lures.word)):
results[0][i] = str("correct rejection")
elif (pressedinfo[0][0] == '3'):
results[0][i] = str('null')
else:
#Present word
stim = visual.TextStim(win,text=test_word.rstrip('\n'))
stim.draw()
win.flip()
#Gather response, response time
prestime = core.getTime()
pressedinfo = event.waitKeys(keyList=['1','2','3','4','5'], timeStamped=True)
#Collect response
responses[0][i] = pressedinfo[0][0]
#Collect response time
RT[0][i] = pressedinfo[0][1]-prestime
#Collect confidence
if pressedinfo[0][0] == '1' or pressedinfo[0][0] == '5':
confidence[0][i] = 'sure'
elif pressedinfo[0][0] == '2' or pressedinfo[0][0] == '4':
confidence[0][i] = 'unsure'
elif pressedinfo[0][0] == '3':
confidence[0][i] = "don't_know"
#Collect determination of old/new
if pressedinfo[0][0] == '4' or pressedinfo[0][0] == '5':
old_new[0][i] = 'new'
elif pressedinfo[0][0] == '1' or pressedinfo[0][0] == '2':
old_new[0][i] = 'old'
elif pressedinfo[0][0] == '3':
old_new[0][i] = 'unsure'
#Collect results
if (pressedinfo[0][0] == '1' or pressedinfo[0][0] == '2') & (sample_mem_data.word[i] in list(targets.word)):
results[0][i] = str("hit")
elif (pressedinfo[0][0] == '1' or pressedinfo[0][0] == '2') & (sample_mem_data.word[i] in list(lures.word)):
results[0][i] = str("false alarm")
elif (pressedinfo[0][0] == '4' or pressedinfo[0][0] == '5') & (sample_mem_data.word[i] in list(targets.word)):
results[0][i] = str("miss")
elif (pressedinfo[0][0] == '4' or pressedinfo[0][0] == '5') & (sample_mem_data.word[i] in list(lures.word)):
results[0][i] = str("correct rejection")
elif (pressedinfo[0][0] == '3'):
results[0][i] = str('null')
win.close()
#Place experiment data arrays in dataframe
exp_mem_data = sample_mem_data.copy()
#Drop unnecessary columns
exp_mem_data = exp_mem_data.drop(columns=['task', 'session', 'list', 'category', 'intrusion', 'rectime'])
data_fields = [responses, results, old_new, confidence, RT]
for i,field in enumerate(data_fields):
exp_mem_data.insert(1, 'name', list(field[0]), allow_duplicates = True)
exp_mem_data.columns = ['Subject Number', 'Response Time', 'Confidence', 'Response Old/New', \
'Hit/Miss/False Alarm/Correct Rejection', 'Response Button', 'Target Lure Status', 'Word']
exp_mem_data.head()
#Export dataframe to .csv
exp_mem_data.to_csv(index=False)
#Create list of images in zip file
images = os.listdir(r"C:\Users\ethan\Desktop\Swarthmore\Fall 2019\Scientific Computing\Homework Assignments\HW5\images\images")
win = visual.Window([600,600],pos=[0,0])
display_time = 1
intermission = .5
for image in images:
stim = visual.ImageStim(win, image=image)
stim.draw() # vs .autoDraw=True
#stim.autoDraw=True
win.flip()
core.wait(display_time)
win.flip()
core.wait(intermission)
win.close()