Test for Individual Differences ********* Lesson ================ .. article-info:: :avatar: UCLA_Suit.jpg :avatar-link: https://www.decisionneurosciencelab.com/elijahgalvan :author: Elijah Galvan :date: September 1, 2023 :read-time: 12 min read :class-container: sd-p-2 sd-outline-muted sd-rounded-1 Goal During this Stage --------------- We want to explicitly test whether or not people are different from each other, or if our findings indicate a tendency that is true of all people in the same way. How to Achieve this Goal ------------ .. dropdown:: Embodying No Individual Differences .. tab-set:: .. tab-item:: Plain English We've already identified the best model and now we want to see if the instance that we proved was best - where we estimated :bdg-success:`Free Parameters` for each :bdg-success:`Subjects` - was justified in its complexity. Even if our best model captures 'individual differences' - i.e. multiple potential strategies - it does not necessarily mean that :bdg-success:`Subjects` are different. Instead it indicates that this multinorm model is able to capture behavior that is not explained by any simplification of it. Testing for individual differences invovles training an instance of our model over data where we do not differentiate between :bdg-success:`Subjects` and we then compare this model's performance to a .. tab-item:: R :: result = fmincon(obj_function,x0 = initial_params, A = NULL, b = NULL, Aeq = NULL, beq = NULL, lb = lower_bounds, ub = upper_bounds, df = trialData) trialData$PredictedNID = vector('numeric', length(trialData$SubjectID)) for (i in 1:length(trialData$IV)){ Utility = vector('numeric', length(Choices)) for (j in 1:length(Choices)){ Utility[j] = utility(parameter1 = results$par[1], parameter2 = results$par[2], construct1 = construct1(trialData$IV[k], trialData$Constant[k], Choices[n]), construct2 = construct2(trialData$IV[k], trialData$Constant[k], Choices[n]), construct3 = construct3(trialData$IV[k], trialData$Constant[k], Choices[n])) } trialData$PredictedNID[i] = Choices[which(Utility == max(Utility))] } subjectData$SS_NID = vector('numeric', length(subjectDatasubjectData$SubjectID)) for (i in 1:length(subjectData$SubjectID)){ trials = which(subjectData$SubjectID[i] == trialData$SubjectID) subjectData$SS_NID[i] = sum((trialData$Decision[trials] - trialData$PredictedNID[trials])**2) } # number of parameter divided by the number of people (i.e. number of parameters for each person) subjectData$AIC_NID = length(trialList$IV) * log(subjectData$SS_NID/length(trialList$IV)) + 2 * (2/length(subjectData$SubjectID)) t.test(subjectData$AIC_NID, subjectData$model_AIC, paired = T) .. tab-item:: MatLab :: options = optimoptions('fmincon', 'Algorithm', 'interior-point'); result = fmincon(@(params) obj_function(params, trialData, 'OLS'), initial_params, [], [], [], [], lower_bounds, upper_bounds, [], options); trialData.PredictedNID = zeros(length(trialData.SubjectID), 1); for i = 1:length(trialData.IV) Utility = zeros(length(Choices), 1); for j = 1:length(Choices) Utility(j) = utility(result(1), result(2), ... construct1(trialData.IV(i), trialData.Constant(i), Choices(j)), ... construct2(trialData.IV(i), trialData.Constant(i), Choices(j)), ... construct3(trialData.IV(i), trialData.Constant(i), Choices(j))); end [~, idx] = max(Utility); trialData.PredictedNID(i) = Choices(idx); end subjectData.SS_NID = zeros(length(subjectData.SubjectID), 1); for i = 1:length(subjectData.SubjectID) trials = find(subjectData.SubjectID(i) == trialData.SubjectID); subjectData.SS_NID(i) = sum((trialData.Decision(trials) - trialData.PredictedNID(trials)).^2); end subjectData.AIC_NID = length(trialList.IV) * log(subjectData.SS_NID / length(trialList.IV)) + 2 * (2 / length(subjectData.SubjectID)); ttest(subjectData.AIC_NID, subjectData.model_AIC, 'paired'); .. tab-item:: Python :: result = minimize(lambda params: obj_function(params, trialData, 'OLS'), initial_params, bounds=list(zip(lower_bounds, upper_bounds))) trialData['PredictedNID'] = np.zeros(len(trialData['SubjectID'])) for i in range(len(trialData['IV'])): Utility = np.zeros(len(Choices)) for j in range(len(Choices)): Utility[j] = utility(result.x[0], result.x[1], construct1(trialData['IV'].iloc[i], trialData['Constant'].iloc[i], Choices[j]), construct2(trialData['IV'].iloc[i], trialData['Constant'].iloc[i], Choices[j]), construct3(trialData['IV'].iloc[i], trialData['Constant'].iloc[i], Choices[j])) trialData['PredictedNID'].iloc[i] = Choices[np.argmax(Utility)] subjectData['SS_NID'] = np.zeros(len(subjectData['SubjectID'])) for i in range(len(subjectData['SubjectID'])): trials = np.where(subjectData['SubjectID'].iloc[i] == trialData['SubjectID'])[0] subjectData['SS_NID'].iloc[i] = np.sum((trialData['Decision'].iloc[trials] - trialData['PredictedNID'].iloc[trials]) ** 2) subjectData['AIC_NID'] = len(trialList['IV']) * np.log(subjectData['SS_NID'] / len(trialList['IV'])) + 2 * (2 / len(subjectData['SubjectID'])) ttest_rel(subjectData['AIC_NID'], subjectData['model_AIC']) Tutorials ========== Tutorial 1 - van Baar, Chang, & Sanfey, 2019 ---------------------- .. dropdown:: Embodying No Individual Differences .. tab-set:: .. tab-item:: R :: result = fmincon(obj_function,x0 = initial_params, A = NULL, b = NULL, Aeq = NULL, beq = NULL, lb = lower_bounds, ub = upper_bounds, df = trialData) trialData$PredictedNID = vector('numeric', length(trialData$Subject)) for (i in 1:length(trialData$Subject)){ if (trialData$Investment[i] > 10) { Choices = seq(0, (trialData$Investment[i] * trialData$Multiplier[i]), round((trialData$Investment[i]*trialData$Multiplier[i])/10)) } else { Choices = seq(0, (trialData$Investment[i] * trialData$Multiplier[i]), 1) } Utility = vector('numeric', length(Choices)) for (n in 1:length(Choices)){ Utility[n] = utility(theta = result$par[1], phi = result$par[2], payout = payout_maximization(trialData$Investment[i], trialData$Multiplier[i], Choices[n]), guilt = guilt(trialData$Investment[i], believed_multiplier = 4, Choices[n], trialData$Multiplier[i]), inequity = inequity(trialData$Investment[i], trialData$Multiplier[i], Choices[n], endowment = 10)) } trialData$PredictedNID[i] = Choices[which(Utility == max(Utility))] } subjectData$SS_NID = vector('numeric', length(subjectData$SubjectID)) for (i in 1:length(subjectData$SubjectID)){ trials = which(subjectData$SubjectID[i] == trialData$Subject) subjectData$SS_NID[i] = sum((as.numeric(trialData$Returned[trials]) - trialData$PredictedNID[trials])**2) } # number of parameter divided by the number of people (i.e. number of parameters for each person) subjectData$AIC_NID = length(df$Investment) * log(subjectData$SS_NID/length(df$Investment)) + 2 * (2/length(subjectData$SubjectID)) t.test(subjectData$modelAIC, subjectData$AIC_NID, paired = T) summary(lm(data = trialData, as.numeric(Returned) ~ PredictedNID)) aic_id = c(mean(subjectData$modelAIC), mean(subjectData$AIC_NID)) qplot(y = aic_id, x = as.factor(c('Individual Differences', 'No Individual Differences')), fill = as.factor(c('Individual Differences', 'No Individual Differences')), color = '', geom = 'col') + labs(x = 'Model', y = 'AIC', fill = NULL) + lims(y = c(-5, 155)) + theme_minimal() + geom_signif(comparisons = list(c('Individual Differences', 'No Individual Differences')), y_position = 135, textsize = 0, tip_length = 0.15)+ annotate("text", x = 1.5, y = 135, label = "p = 0.18", vjust = -1, size = 4) + scale_fill_manual(values = c(rgb(218, 165, 32, maxColorValue = 255), rgb(132.5, 132.5, 132.5, maxColorValue = 255))) + scale_color_manual(values = c(rgb(0, 0, 0, maxColorValue = 255))) .. tab-item:: MatLab :: result = fmincon(@(params) obj_function(params, trialData), initial_params, [], [], [], [], lower_bounds, upper_bounds); trialData.PredictedNID = NaN(1, length(trialData.Subject)); for i = 1:length(trialData.Subject) if trialData.Investment(i) > 10 Choices = 0:round((trialData.Investment(i) * trialData.Multiplier(i))/10):(trialData.Investment(i) * trialData.Multiplier(i)); else Choices = 0:1:(trialData.Investment(i) * trialData.Multiplier(i)); end Utility = NaN(1, length(Choices)); for n = 1:length(Choices) Utility(n) = utility(result(1), result(2), ... payout_maximization(trialData.Investment(i), trialData.Multiplier(i), Choices(n)), ... guilt(trialData.Investment(i), 4, Choices(n), trialData.Multiplier(i)), ... inequity(trialData.Investment(i), trialData.Multiplier(i), Choices(n), 10)); end [~, maxIndex] = max(Utility); trialData.PredictedNID(i) = Choices(maxIndex); end subjectData.SS_NID = NaN(1, length(subjectData.SubjectID)); for i = 1:length(subjectData.SubjectID) trials = find(subjectData.SubjectID(i) == trialData.Subject); subjectData.SS_NID(i) = sum((trialData.Returned(trials) - trialData.PredictedNID(trials)).^2); end subjectData.AIC_NID = length(df.Investment) * log(subjectData.SS_NID/length(df.Investment)) + 2 * (2/length(subjectData.SubjectID)); ttest(subjectData.modelAIC, subjectData.AIC_NID); lm_result = fitlm(trialData, 'Returned ~ PredictedNID'); disp(lm_result); aic_id = [mean(subjectData.modelAIC), mean(subjectData.AIC_NID)]; figure; bar(categorical({'Individual Differences', 'No Individual Differences'}), aic_id, 'FaceColor', [0.85 0.85 0.85]); ylabel('AIC'); ylim([-5 155]); hold on; sigstar({'Individual Differences', 'No Individual Differences'}, [0.15, 135, 1.5, 135], [0, 0, 0]); text(1.5, 135, 'p = 0.18', 'VerticalAlignment', 'top', 'HorizontalAlignment', 'center', 'FontSize', 10); hold off; .. tab-item:: Python :: result = minimize(lambda params: obj_function(params, trialData), initial_params, bounds=list(zip(lower_bounds, upper_bounds))) trialData['PredictedNID'] = np.nan for i in range(1, len(trialData['Subject']) + 1): if trialData['Investment'].iloc[i - 1] > 10: Choices = np.arange(0, (trialData['Investment'].iloc[i - 1] * trialData['Multiplier'].iloc[i - 1]), round((trialData['Investment'].iloc[i - 1] * trialData['Multiplier'].iloc[i - 1])/10)) else: Choices = np.arange(0, (trialData['Investment'].iloc[i - 1] * trialData['Multiplier'].iloc[i - 1]), 1) Utility = np.zeros(len(Choices)) for n in range(len(Choices)): Utility[n] = utility(result.x[0], result.x[1], payout_maximization(trialData['Investment'].iloc[i - 1], trialData['Multiplier'].iloc[i - 1], Choices[n]), guilt(trialData['Investment'].iloc[i - 1], 4, Choices[n], trialData['Multiplier'].iloc[i - 1]), inequity(trialData['Investment'].iloc[i - 1], trialData['Multiplier'].iloc[i - 1], Choices[n], 10)) correct_choice = Choices[np.argmax(Utility)] trialData.at[i - 1, 'PredictedNID'] = correct_choice subjectData['SS_NID'] = np.nan for i in range(1, len(subjectData['SubjectID']) + 1): trials = trialData[trialData['Subject'] == subjectData['SubjectID'].iloc[i - 1]] subjectData.at[i - 1, 'SS_NID'] = np.sum((trials['Returned'].to_numpy() - trials['PredictedNID'].to_numpy())**2) subjectData['AIC_NID'] = len(df['Investment']) * np.log(subjectData['SS_NID']/len(df['Investment'])) + 2 * (2/len(subjectData['SubjectID'])) ttest_rel(subjectData['modelAIC'], subjectData['AIC_NID']) lm_result = sm.OLS(trialData['Returned'], sm.add_constant(trialData['PredictedNID'])).fit() print(lm_result.summary()) aic_id = [np.mean(subjectData['modelAIC']), np.mean(subjectData['AIC_NID'])] plt.bar(['Individual Differences', 'No Individual Differences'], aic_id, color=[0.85, 0.85, 0.85]) plt.ylabel('AIC') plt.ylim([-5, 155]) plt.xticks(rotation=45, ha='right') plt.text(1.5, 135, 'p = 0.18', va='bottom', ha='center', fontsize=10) plt.show() Tutorial 2 - Galvan & Sanfey, 2024 ------------------- .. dropdown:: Embodying No Individual Differences .. tab-set:: .. tab-item:: R :: trialData$PredictedNID = vector('numeric', length(trialData$SubjectID)) for (k in 1:length(conditions)){ z = which(trialData$condition == conditions[j]) df = trialData[z, c(6, 12:20, 2)] result = fmincon(obj_function,x0 = initial_params, A = NULL, b = NULL, Aeq = NULL, beq = NULL, lb = lower_bounds, ub = upper_bounds, df = df) for (i in 1:length(df)){ Utility = vector('numeric', length(Choices)) for (n in 1:length(Choices)){ Utility[n] = utility(theta = result$par[1], phi = result$par[2], Equity = equity(new_value(df[i, 1:10], choices[n]), df[i, 1:10], choices[n]), Equality = equality(new_value(df[i, 1:10], choices[n]), df[i, 1:10], choices[n]), Payout = payout(new_value(df[i, 1], choices[n]), df[i, 1], choices[n])) } trialData$PredictedNID[z[i]] = Choices[which(Utility == max(Utility))] } } subjectData$SSNIDMerit = vector('numeric', length(subjectDatasubjectData$SubjectID)) subjectData$SSNIDEntitlement = vector('numeric', length(subjectDatasubjectData$SubjectID)) subjectData$SSNIDCorruption = vector('numeric', length(subjectDatasubjectData$SubjectID)) subjectData$SSNIDLuck = vector('numeric', length(subjectDatasubjectData$SubjectID)) for (i in 1:length(subjectData$SubjectID)){ trialsMerit = which(subjectData$SubjectID[i] == trialData$SubjectID && 'merit' == trialData$Condition) trialsEntitlement = which(subjectData$SubjectID[i] == trialData$SubjectID && 'entitlement' == trialData$Condition) trialsCorruption = which(subjectData$SubjectID[i] == trialData$SubjectID && 'corruption' == trialData$Condition) trialsLuck = which(subjectData$SubjectID[i] == trialData$SubjectID && 'luck' == trialData$Condition) subjectData$SSNIDMerit[i] = sum((trialData$observedTaxRate[trialsMerit] - trialData$PredictedNID[trialsMerit])**2) subjectData$SSNIDEntitlement[i] = sum((trialData$observedTaxRate[trialsEntitlement] - trialData$PredictedNID[trialsEntitlement])**2) subjectData$SSNIDCorruption[i] = sum((trialData$observedTaxRate[trialsCorruption] - trialData$PredictedNID[trialsCorruption])**2) subjectData$SSNIDLuck[i] = sum((trialData$observedTaxRate[trialsLuck] - trialData$PredictedNID[trialsLuck])**2) } subjectData$AICNIDMerit = length(trialsMerit) * log(subjectData$SSNIDMerit/length(trialsMerit)) + 2 * (2/length(subjectData$SubjectID)) subjectData$AICNIDEntitlement = length(trialsEntitlement) * log(subjectData$SSNIDEntitlement/length(trialsEntitlement)) + 2 * (2/length(subjectData$SubjectID)) subjectData$AICNIDCorruption = length(trialsCorruption) * log(subjectData$SSNIDCorruption/length(trialsCorruption)) + 2 * (2/length(subjectData$SubjectID)) subjectData$AICNIDLuck = length(trialsLuck) * log(subjectData$SSNIDLuck/length(trialsLuck)) + 2 * (2/length(subjectData$SubjectID)) t.test(subjectData$AICMerit, subjectData$AICNIDMerit, paired = T, alternative = 'less', conf.int = (1 - alpha)) t.test(subjectData$AICEntitlement, subjectData$AICNIDEntitlement, paired = T, alternative = 'less', conf.int = (1 - alpha)) t.test(subjectData$AICCorruption, subjectData$AICNIDCorruption, paired = T, alternative = 'less', conf.int = (1 - alpha)) t.test(subjectData$AICLuck, subjectData$AICNIDLuck, paired = T, alternative = 'less', conf.int = (1 - alpha)) .. tab-item:: MatLab :: trialData.PredictedNID = zeros(1, length(trialData.SubjectID)); for j = 1:length(conditions) z = find(trialData.condition == conditions(j)); df = trialData(z, [6, 12:20, 2]); result = fmincon(@(params) obj_function(params, df), initial_params, [], [], [], [], lower_bounds, upper_bounds); for i = 1:length(df) Utility = zeros(1, length(Choices)); for n = 1:length(Choices) Utility(n) = utility(result(1), result(2), ... equity(new_value(df(i, 1:10), Choices(n)), df(i, 1:10), Choices(n)), ... equality(new_value(df(i, 1:10), Choices(n)), df(i, 1:10), Choices(n)), ... payout(new_value(df(i, 1), Choices(n)), df(i, 1), Choices(n))); end trialData.PredictedNID(z(i)) = Choices(Utility == max(Utility)); end end subjectData.SSNIDMerit = zeros(1, length(subjectData.SubjectID)); subjectData.SSNIDEntitlement = zeros(1, length(subjectData.SubjectID)); subjectData.SSNIDCorruption = zeros(1, length(subjectData.SubjectID)); subjectData.SSNIDLuck = zeros(1, length(subjectData.SubjectID)); for i = 1:length(subjectData.SubjectID) trialsMerit = find(subjectData.SubjectID(i) == trialData.SubjectID & strcmp('merit', trialData.Condition)); trialsEntitlement = find(subjectData.SubjectID(i) == trialData.SubjectID & strcmp('entitlement', trialData.Condition)); trialsCorruption = find(subjectData.SubjectID(i) == trialData.SubjectID & strcmp('corruption', trialData.Condition)); trialsLuck = find(subjectData.SubjectID(i) == trialData.SubjectID & strcmp('luck', trialData.Condition)); subjectData.SSNIDMerit(i) = sum((trialData.observedTaxRate(trialsMerit) - trialData.PredictedNID(trialsMerit)).^2); subjectData.SSNIDEntitlement(i) = sum((trialData.observedTaxRate(trialsEntitlement) - trialData.PredictedNID(trialsEntitlement)).^2); subjectData.SSNIDCorruption(i) = sum((trialData.observedTaxRate(trialsCorruption) - trialData.PredictedNID(trialsCorruption)).^2); subjectData.SSNIDLuck(i) = sum((trialData.observedTaxRate(trialsLuck) - trialData.PredictedNID(trialsLuck)).^2); end subjectData.AICNIDMerit = length(trialsMerit) * log(subjectData.SSNIDMerit/length(trialsMerit)) + 2 * (2/length(subjectData.SubjectID)); subjectData.AICNIDEntitlement = length(trialsEntitlement) * log(subjectData.SSNIDEntitlement/length(trialsEntitlement)) + 2 * (2/length(subjectData.SubjectID)); subjectData.AICNIDCorruption = length(trialsCorruption) * log(subjectData.SSNIDCorruption/length(trialsCorruption)) + 2 * (2/length(subjectData.SubjectID)); subjectData.AICNIDLuck = length(trialsLuck) * log(subjectData.SSNIDLuck/length(trialsLuck)) + 2 * (2/length(subjectData.SubjectID)); alpha = 0.05; ttest(subjectData.AICMerit, subjectData.AICNIDMerit, 'Tail', 'left', 'Alpha', alpha); ttest(subjectData.AICEntitlement, subjectData.AICNIDEntitlement, 'Tail', 'left', 'Alpha', alpha); ttest(subjectData.AICCorruption, subjectData.AICNIDCorruption, 'Tail', 'left', 'Alpha', alpha); ttest(subjectData.AICLuck, subjectData.AICNIDLuck, 'Tail', 'left', 'Alpha', alpha); .. tab-item:: Python :: trialData['PredictedNID'] = np.zeros(len(trialData['SubjectID'])) for j in range(len(conditions)): z = np.where(trialData['condition'] == conditions[j])[0] df = trialData.iloc[z, [5, 11, 12, 13, 14, 15, 16, 17, 18, 19, 1]] result = minimize(lambda params: obj_function(params, df), initial_params, bounds=list(zip(lower_bounds, upper_bounds))) for i in range(len(df)): Utility = np.zeros(len(Choices)) for n in range(len(Choices)): Utility[n] = utility(result.x[0], result.x[1], equity(new_value(df.iloc[i, 0:9], Choices[n]), df.iloc[i, 0:9], Choices[n]), equality(new_value(df.iloc[i, 0:9], Choices[n]), df.iloc[i, 0:9], Choices[n]), payout(new_value(df.iloc[i, 0], Choices[n]), df.iloc[i, 0], Choices[n])) trialData.at[z[i], 'PredictedNID'] = Choices[np.argmax(Utility)] subjectData['SSNIDMerit'] = np.zeros(len(subjectData['SubjectID'])) subjectData['SSNIDEntitlement'] = np.zeros(len(subjectData['SubjectID'])) subjectData['SSNIDCorruption'] = np.zeros(len(subjectData['SubjectID'])) subjectData['SSNIDLuck'] = np.zeros(len(subjectData['SubjectID'])) for i in range(len(subjectData['SubjectID'])): trialsMerit = np.where((subjectData['SubjectID'][i] == trialData['SubjectID']) & (trialData['Condition'] == 'merit'))[0] trialsEntitlement = np.where((subjectData['SubjectID'][i] == trialData['SubjectID']) & (trialData['Condition'] == 'entitlement'))[0] trialsCorruption = np.where((subjectData['SubjectID'][i] == trialData['SubjectID']) & (trialData['Condition'] == 'corruption'))[0] trialsLuck = np.where((subjectData['SubjectID'][i] == trialData['SubjectID']) & (trialData['Condition'] == 'luck'))[0] subjectData.at[i, 'SSNIDMerit'] = np.sum((trialData['observedTaxRate'][trialsMerit] - trialData['PredictedNID'][trialsMerit])**2) subjectData.at[i, 'SSNIDEntitlement'] = np.sum((trialData['observedTaxRate'][trialsEntitlement] - trialData['PredictedNID'][trialsEntitlement])**2) subjectData.at[i, 'SSNIDCorruption'] = np.sum((trialData['observedTaxRate'][trialsCorruption] - trialData['PredictedNID'][trialsCorruption])**2) subjectData.at[i, 'SSNIDLuck'] = np.sum((trialData['observedTaxRate'][trialsLuck] - trialData['PredictedNID'][trialsLuck])**2) subjectData['AICNIDMerit'] = len(trialsMerit) * np.log(subjectData['SSNIDMerit'] / len(trialsMerit)) + 2 * (2 / len(subjectData['SubjectID'])) subjectData['AICNIDEntitlement'] = len(trialsEntitlement) * np.log(subjectData['SSNIDEntitlement'] / len(trialsEntitlement)) + 2 * (2 / len(subjectData['SubjectID'])) subjectData['AICNIDCorruption'] = len(trialsCorruption) * np.log(subjectData['SSNIDCorruption'] / len(trialsCorruption)) + 2 * (2 / len(subjectData['SubjectID'])) subjectData['AICNIDLuck'] = len(trialsLuck) * np.log(subjectData['SSNIDLuck'] / len(trialsLuck)) + 2 * (2 / len(subjectData['SubjectID'])) alpha = 0.05 ttest_rel(subjectData['AICMerit'], subjectData['AICNIDMerit'], alternative='less', nan_policy='omit') ttest_rel(subjectData['AICEntitlement'], subjectData['AICNIDEntitlement'], alternative='less', nan_policy='omit') ttest_rel(subjectData['AICCorruption'], subjectData['AICNIDCorruption'], alternative='less', nan_policy='omit') ttest_rel(subjectData['AICLuck'], subjectData['AICNIDLuck'], alternative='less', nan_policy='omit') Tutorial 3 - Crockett et al., 2014 ------------------- .. dropdown:: Embodying No Individual Differences .. tab-set:: .. tab-item:: R :: resultNID = fmincon(obj_function, x0 = initial_params, lb = lower_bounds, ub = upper_bounds, df = trialData, optimMethod = "OLS") dfNID = generate_predictions(trialData, resultNID) sum(dfNID$choseHarm == round(dfNID$ProbHarm))/nrow(dfNID) altSubjectData$Deviance_NID = 0 for (i in 1:length(included_subjects)){ df = grab_data(included_subjects[i]); if (is.character(df)){next} else {trials = which(included_subjects[i] == dfNID$SubjectID)} df = dfNID[trials, ] altSubjectData$Deviance_NID[i] = -2*sum(df$choseHarm * log(df$ProbHarm) + (1 - df$choseHarm) * log(1 - df$ProbHarm)) } altSubjectData$BIC_NID = as.numeric(altSubjectData$Deviance_NID) + log(152) * 6/(nrow(dfNID)) t.test(subjectData$BIC[-20], altSubjectData$BIC_NID[-20], paired = T) which(modelBIC > sum(altSubjectData$BIC_NID)) .. tab-item:: MatLab :: .. tab-item:: Python :: Tutorial 4 - Li et al., 2022 ------------------- .. dropdown:: Embodying No Individual Differences .. tab-set:: .. tab-item:: R :: resultNID = fmincon(of_ar, x0 = initial_params[c(1,3:6)], lb = lower_bounds[c(1,3:6)], ub = upper_bounds[c(1,3:6)], df = trialData[2:8], optimMethod = "MLE") pars = c(resultNID$par[1], 0, resultNID$par[2:5]) trialData$Prob1_NID = generatePredictions(pars, trialData) sum(trialData$Chose1 == round(trialData$Prob1_NID))/nrow(trialData) altSubjectData$Deviance_NID = 0 for (i in 1:length(included_subjects)){ trials = which(included_subjects[i] == trialData$SubjectID) df = trialData[trials, ] altSubjectData$Deviance_NID[i] = -2*sum(df$Chose1 * log(df$Prob1_NID) + (1 - df$Chose1) * log(1 - df$Prob1_NID)) } altSubjectData$BIC_NID = as.numeric(altSubjectData$Deviance_NID) + log(65) * 6/(length(included_subjects)) t.test(altSubjectData$BIC_M5, altSubjectData$BIC_NID, paired = T) which(modelBIC > sum(altSubjectData$BIC_NID)) .. tab-item:: MatLab :: .. tab-item:: Python ::