From 2a764684060846a80c66d4f3dde629f79c5588e5 Mon Sep 17 00:00:00 2001 From: Xuan Liu Date: Sat, 15 Aug 2026 16:57:35 +0800 Subject: [PATCH] Add study: study_016 --- studies/study_016/README.md | 7 + .../study_016/audit/missing_information.json | 68 ++++ studies/study_016/evaluation/evaluation.py | 268 ++++++++++++++ studies/study_016/materials/materials.json | 197 ++++++++++ studies/study_016/source/evidence.json | 289 +++++++++++++++ studies/study_016/source/paper_metadata.json | 30 ++ studies/study_016/study.json | 95 +++++ .../task/__pycache__/adapter.cpython-311.pyc | Bin 0 -> 21113 bytes studies/study_016/task/adapter.py | 344 ++++++++++++++++++ studies/study_016/task/task.json | 88 +++++ 10 files changed, 1386 insertions(+) create mode 100644 studies/study_016/README.md create mode 100644 studies/study_016/audit/missing_information.json create mode 100644 studies/study_016/evaluation/evaluation.py create mode 100644 studies/study_016/materials/materials.json create mode 100644 studies/study_016/source/evidence.json create mode 100644 studies/study_016/source/paper_metadata.json create mode 100644 studies/study_016/study.json create mode 100644 studies/study_016/task/__pycache__/adapter.cpython-311.pyc create mode 100644 studies/study_016/task/adapter.py create mode 100644 studies/study_016/task/task.json diff --git a/studies/study_016/README.md b/studies/study_016/README.md new file mode 100644 index 0000000..58c6a00 --- /dev/null +++ b/studies/study_016/README.md @@ -0,0 +1,7 @@ +# The "False Consensus Effect": An Egocentric Bias in Social Perception and Attribution Processes + +This HumanStudy-Hub package was reconstructed from a published paper. + +- Review `study.json` for the study overview and readiness status. +- Review `audit/missing_information.json` before running the study. +- Run `python task/adapter.py --smoke-test` to check the package entry point. diff --git a/studies/study_016/audit/missing_information.json b/studies/study_016/audit/missing_information.json new file mode 100644 index 0000000..16c8c7b --- /dev/null +++ b/studies/study_016/audit/missing_information.json @@ -0,0 +1,68 @@ +{ + "_purpose": "Authoritative researcher checklist of missing verbatim content and researcher decisions still required before this package can be treated as a full, faithful reconstruction of Ross, Greene & House (1977). Every entry has study/field/reason/impact/suggested_action.", + "entries": [ + { + "study": "study2", + "field": "materials.study2.items[*] full item wording", + "reason": "The paper states explicitly (p.286, evidence.json id s2-questionnaire-not-reproduced) that the full 35-item questionnaire text is 'too lengthy to be reproduced' and was available only by request from the first author. Only the short category-pair labels from Table 3 survive in this source.", + "impact": "task/adapter.py administers Study 2 using paraphrased category labels (e.g. 'Shy / not shy') rather than the original item stems. Participant responses may not match how the original wording framed the choice, especially for ambiguous items (e.g. what counted as 'often' thinking about dying).", + "suggested_action": "Obtain the original questionnaire from the paper's open materials (if the contributor supplies an authorized OSF/author-provided URL in a future job) or transcribe it from an institutional archive, then replace materials.json study2.items[*] with verbatim item text and relabel evidence_label to 'verbatim'." + }, + { + "study": "study2", + "field": "materials.study2.items[*].category_1 for 'Subscribe to magazines on list provided'", + "reason": "The paper references 'magazines on list provided' but the actual magazine list is not reproduced anywhere in the extracted text.", + "impact": "This item cannot be administered exactly as originally presented; adapter.py presents only the generic category label.", + "suggested_action": "If the original magazine list can be located (author request), add it verbatim; otherwise mark this item as excluded from faithful replication rather than guessing a list." + }, + { + "study": "study2", + "field": "Table 3 numeric cells (mean percentage estimates, t-values)", + "reason": "pdftotext OCR of the Table 3 columns on pages 287-288 is degraded in places (garbled digits/characters, e.g. 'h0.24' style artifacts in the political-expectations rows).", + "impact": "source/evidence.json id s2-table3-items-and-results transcribes the table as extracted, but a handful of individual cell values should be treated as approximate; they are not used programmatically anywhere in task/adapter.py or evaluation/evaluation.py, only as historical-comparison context.", + "suggested_action": "Re-OCR page 287-288 at higher resolution or against a cleaner PDF scan, or manually verify against the published journal issue, before citing exact per-item t-values from this package." + }, + { + "study": "study1", + "field": "materials.trait_scale_template anchors for traits other than cooperativeness", + "reason": "The paper reproduces full verbatim 100-point anchor wording for exactly one trait (cooperativeness); it states all other traits followed 'the same' structure but never reprints their specific anchor sentences.", + "impact": "materials.json renders anchors for all other traits (shyness, trust, adventurousness, gregariousness, laziness, competitiveness, generosity, self-confidence, legal knowledge, argumentativeness, miserliness, rationality, social concern, idealism, selfishness, and the Study 3/4 trait set) via a paraphrase template, explicitly labeled 'derived'. Exact original wording for these anchors is unrecoverable from this source.", + "suggested_action": "If open materials become available (with user authorization), replace the derived anchors with verbatim wording for each trait." + }, + { + "study": "study1", + "field": "Table 2 / Table 3 per-trait numeric breakdown (Study 1 trait ratings)", + "reason": "The printed paper appears to mislabel the Study 1 trait-ratings table as 'Table 3' (duplicating the Study 2 table number) and the OCR of its numeric cells (pages 283-284, e.g. 'x9 5', '54.9') is degraded.", + "impact": "source/evidence.json id s1-table2-trait-note relies on the narrative F-ratios/p-values in body text rather than the raw table cells, which are not independently re-derivable from this PDF extraction.", + "suggested_action": "Obtain a cleaner scan or the publisher's typeset PDF to recover exact per-trait numeric means for Study 1's Table 2/3." + }, + { + "study": "study4", + "field": "trait list used for Study 4 ratings", + "reason": "Study 1 and Study 3 explicitly name the traits rated; Study 4's methods section (p.291) does not restate which traits were used, only that ratings were made about two supposedly real target individuals.", + "impact": "materials.json study4.traits carries over Study 3's 8-trait list as a labeled assumption ('missing' evidence label). If the original Study 4 trait list differed, task/adapter.py's Study 4 condition would be administering the wrong traits.", + "suggested_action": "Confirm the Study 4 trait list against the original materials (author request) before treating Study 4 trait-extremity results as more than exploratory." + }, + { + "study": "study4", + "field": "faithful behavioral replication of the real-choice manipulation", + "reason": "The original Study 4 depended on a live experimenter, a real 30-minute campus walk with a genuine social-compliance cost, and post-hoc debriefing about deception. A text-only agent task cannot reproduce the lived behavioral stakes, only the textual cover story and a stated hypothetical choice.", + "impact": "task/task.json marks study4 readiness as 'blocked_partial': results from this condition should be interpreted as a text-based reconstruction, not a behavioral replication, and must not be pooled with real Study 4 data from the original paper.", + "suggested_action": "If a researcher wants a truer behavioral analogue, this would require a different experimental platform (e.g. an actual field task or an incentivized decision with real consequences for the agent/participant) rather than a text-only conversational task." + }, + { + "study": "study1", + "field": "space_program story option-label consistency", + "reason": "The story text asks about voting 'for'/'against' the funding allocation, but Table 1 in the paper labels the same two options 'vote for cutback' / 'vote against cutback' -- an apparent inconsistency in the original publication (possibly a sign flip between the story framing and the table labeling).", + "impact": "materials.json preserves the story-text framing ('for the space program allocation' / 'against') for participant-facing text, since that is what a participant actually reads, and flags the Table 1 labeling discrepancy in source/evidence.json (s1-story-spaceprogram). A researcher should decide which framing to trust when comparing new data to the original Table 1 percentages.", + "suggested_action": "Consult original materials (if available) to determine whether Table 1's 'cutback' labels reflect a different/earlier version of the story, or a labeling error, before directly comparing new consensus estimates to the published Table 1 numbers for this story." + }, + { + "study": "paper", + "field": "Fields & Schuman unpublished manuscript citation (footnote 5)", + "reason": "The paper cites an unpublished manuscript ('Public Beliefs about the Beliefs of the Public') as corroborating evidence; this could not be independently retrieved or verified because network research was not authorized for this job.", + "impact": "This citation is recorded as-is in source/evidence.json (item refs-1 context) but not verified.", + "suggested_action": "If a future job for this paper supplies an authorized external-materials URL, this citation could be checked, but it is not required for running the core task/evaluation package." + } + ] +} diff --git a/studies/study_016/evaluation/evaluation.py b/studies/study_016/evaluation/evaluation.py new file mode 100644 index 0000000..8658a7e --- /dev/null +++ b/studies/study_016/evaluation/evaluation.py @@ -0,0 +1,268 @@ +#!/usr/bin/env python3 +""" +Evaluation for the Ross, Greene, & House (1977) "False Consensus Effect" package. + +Consumes a JSON-lines file of participant response records produced by +task/adapter.py (one record per line, one simulated participant each) and +tests the two hypotheses common to Study 1, Study 3, and Study 4: + + H1 (perceived consensus): participants who personally choose option X + estimate a higher percentage of peers choosing X than participants who + chose the alternative. + H2 (trait-rating extremity): participants give less extreme trait ratings + to a "typical" actor who shares their own choice than to one who does not. + +Study 2 is evaluated separately (per-item direction/count check, matching +the paper's "32 of 34 items in predicted direction" summary statistic). + +No network access is used or required. Where too few records are supplied to +run a given check, that check reports status "not_ready" with the specific +missing requirement rather than fabricating a result. +""" +import argparse +import json +import math +import statistics +import sys +from collections import defaultdict + + +def load_records(path): + records = [] + with open(path, "r", encoding="utf-8") as f: + for line in f: + line = line.strip() + if line: + records.append(json.loads(line)) + return records + + +def normal_two_tailed_p(z): + """Two-tailed p-value from the standard normal CDF (erf-based).""" + return 2.0 * (1.0 - 0.5 * (1.0 + math.erf(abs(z) / math.sqrt(2)))) + + +def welch_t_test(sample1, sample2): + """Welch's t-test for unequal variances. Returns dict with t, df, p (normal + approximation to the t-distribution -- adequate for the n>~20 per-group + sizes this package targets; not an exact Student-t CDF, to avoid a SciPy + dependency in an offline-only adapter).""" + n1, n2 = len(sample1), len(sample2) + if n1 < 2 or n2 < 2: + return None + m1, m2 = statistics.mean(sample1), statistics.mean(sample2) + v1, v2 = statistics.variance(sample1), statistics.variance(sample2) + se = math.sqrt(v1 / n1 + v2 / n2) + if se == 0: + return {"t": 0.0, "df": n1 + n2 - 2, "p_two_tailed_normal_approx": 1.0, "mean1": m1, "mean2": m2} + t = (m1 - m2) / se + df_num = (v1 / n1 + v2 / n2) ** 2 + df_den = ((v1 / n1) ** 2) / (n1 - 1) + ((v2 / n2) ** 2) / (n2 - 1) + df = df_num / df_den if df_den > 0 else n1 + n2 - 2 + p = normal_two_tailed_p(t) + return {"t": t, "df": df, "p_two_tailed_normal_approx": p, "mean1": m1, "mean2": m2} + + +def one_sample_t_test(diffs): + n = len(diffs) + if n < 2: + return None + m = statistics.mean(diffs) + sd = statistics.stdev(diffs) + if sd == 0: + return {"t": float("inf") if m != 0 else 0.0, "df": n - 1, "p_two_tailed_normal_approx": 0.0 if m != 0 else 1.0, "mean_diff": m, "n": n} + se = sd / math.sqrt(n) + t = m / se + p = normal_two_tailed_p(t) + return {"t": t, "df": n - 1, "p_two_tailed_normal_approx": p, "mean_diff": m, "n": n} + + +def evaluate_consensus_hypothesis(records, study_id, condition_id): + """H1 for study1/study3/study4: own-choice group's estimate of their own + option should exceed the other group's estimate of that same option.""" + subset = [r for r in records if r.get("study_id") == study_id and r.get("condition_id") == condition_id] + if not subset: + return {"status": "not_ready", "missing_requirement": f"no records for {study_id}/{condition_id}"} + + options = sorted({opt for r in subset for opt in r.get("consensus_estimate", {})}) + if len(options) != 2: + return {"status": "not_ready", "missing_requirement": "records do not agree on a two-option consensus_estimate schema"} + optA, optB = options + + group_est_for_A = defaultdict(list) # own_choice -> list of estimate(%A) + for r in subset: + est = r.get("consensus_estimate", {}) + if optA not in est: + continue + choice = r.get("own_choice") + if choice not in (optA, optB): + continue + group_est_for_A[choice].append(float(est[optA])) + + if len(group_est_for_A.get(optA, [])) < 2 or len(group_est_for_A.get(optB, [])) < 2: + return { + "status": "not_ready", + "missing_requirement": ( + f"need >=2 participants choosing '{optA}' and >=2 choosing '{optB}' in {study_id}/{condition_id}; " + f"have {len(group_est_for_A.get(optA, []))} and {len(group_est_for_A.get(optB, []))}" + ), + } + + test = welch_t_test(group_est_for_A[optA], group_est_for_A[optB]) + predicted_direction = test["mean1"] > test["mean2"] + return { + "status": "ok", + "study_id": study_id, + "condition_id": condition_id, + "option_compared": optA, + "n_chose_optA": len(group_est_for_A[optA]), + "n_chose_optB": len(group_est_for_A[optB]), + "mean_estimate_pctA_by_optA_choosers": test["mean1"], + "mean_estimate_pctA_by_optB_choosers": test["mean2"], + "predicted_direction_confirmed": predicted_direction, + "t": test["t"], + "df": test["df"], + "p_two_tailed_normal_approx": test["p_two_tailed_normal_approx"], + "note": "p-value uses a normal approximation to the t-distribution; see welch_t_test docstring.", + } + + +def evaluate_trait_extremity_hypothesis(records, study_id, condition_id): + """H2 for study1/study3/study4: within each participant, the trait-rating + extremity (|rating|, averaged over traits) for the actor who differs from + the rater's own choice should exceed the extremity for the actor who + matches the rater's own choice.""" + subset = [r for r in records if r.get("study_id") == study_id and r.get("condition_id") == condition_id and r.get("trait_ratings")] + if len(subset) < 2: + return {"status": "not_ready", "missing_requirement": f"need >=2 records with trait_ratings for {study_id}/{condition_id}; have {len(subset)}"} + + diffs = [] + for r in subset: + choice = r.get("own_choice") + traits = r.get("trait_ratings", {}) + matched_vals, mismatched_vals = [], [] + for trait, ratings in traits.items(): + for target, val in ratings.items(): + if target == choice: + matched_vals.append(abs(float(val))) + else: + mismatched_vals.append(abs(float(val))) + if not matched_vals or not mismatched_vals: + continue + diffs.append(statistics.mean(mismatched_vals) - statistics.mean(matched_vals)) + + if len(diffs) < 2: + return {"status": "not_ready", "missing_requirement": "could not compute matched/mismatched extremity pairs from trait_ratings"} + + test = one_sample_t_test(diffs) + return { + "status": "ok", + "study_id": study_id, + "condition_id": condition_id, + "n": test["n"], + "mean_extremity_difference_mismatched_minus_matched": test["mean_diff"], + "predicted_direction_confirmed": test["mean_diff"] > 0, + "t": test["t"], + "df": test["df"], + "p_two_tailed_normal_approx": test["p_two_tailed_normal_approx"], + "note": "p-value uses a normal approximation to the t-distribution; see welch_t_test docstring.", + } + + +def evaluate_study2(records): + subset = [r for r in records if r.get("study_id") == "study2"] + if not subset: + return {"status": "not_ready", "missing_requirement": "no study2 records supplied"} + + per_item = defaultdict(lambda: {"cat1": [], "cat2": []}) + for r in subset: + self_cat = {row["item_index"]: row["category_chosen"] for row in r.get("self_category", [])} + peer_est = {row["item_index"]: row["pct_category_1"] for row in r.get("peer_estimate_pct", [])} + for idx, cat in self_cat.items(): + if idx not in peer_est: + continue + bucket = "cat1" if cat == "category_1" else "cat2" + per_item[idx][bucket].append(float(peer_est[idx])) + + item_results = {} + predicted_direction_count = 0 + tested_count = 0 + for idx, groups in per_item.items(): + if len(groups["cat1"]) < 2 or len(groups["cat2"]) < 2: + item_results[idx] = {"status": "not_ready", "missing_requirement": "need >=2 self-raters in each category for this item"} + continue + test = welch_t_test(groups["cat1"], groups["cat2"]) + predicted = test["mean1"] > test["mean2"] + tested_count += 1 + if predicted: + predicted_direction_count += 1 + item_results[idx] = { + "status": "ok", + "n_cat1": len(groups["cat1"]), + "n_cat2": len(groups["cat2"]), + "mean_estimate_by_cat1_raters": test["mean1"], + "mean_estimate_by_cat2_raters": test["mean2"], + "predicted_direction_confirmed": predicted, + "t": test["t"], + "p_two_tailed_normal_approx": test["p_two_tailed_normal_approx"], + } + + if tested_count == 0: + return {"status": "not_ready", "missing_requirement": "no item had >=2 respondents in both self-categories yet"} + + return { + "status": "ok", + "items_tested": tested_count, + "items_total_available": len(per_item), + "items_in_predicted_direction": predicted_direction_count, + "paper_reported_baseline": "32 of 34 items in predicted direction (Ross, Greene & House, 1977, p.286)", + "per_item": item_results, + } + + +STUDY_CONDITIONS = { + "study1": ["supermarket", "term_paper", "traffic_ticket", "space_program"], + "study3": ["eat_at_joes", "repent"], + "study4": ["generic"], +} + + +def run_evaluation(records, only_study=None): + result = {"consensus_hypothesis": {}, "trait_extremity_hypothesis": {}, "study2": None} + + for study_id, conditions in STUDY_CONDITIONS.items(): + if only_study and study_id != only_study: + continue + for condition_id in conditions: + key = f"{study_id}/{condition_id}" + result["consensus_hypothesis"][key] = evaluate_consensus_hypothesis(records, study_id, condition_id) + result["trait_extremity_hypothesis"][key] = evaluate_trait_extremity_hypothesis(records, study_id, condition_id) + + if only_study is None or only_study == "study2": + result["study2"] = evaluate_study2(records) + + return result + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--records", required=True, help="path to a JSON-lines file of adapter.py response records") + parser.add_argument("--study", choices=["study1", "study2", "study3", "study4"], help="restrict evaluation to one study") + args = parser.parse_args() + + try: + records = load_records(args.records) + except FileNotFoundError: + print(json.dumps({"status": "not_ready", "missing_requirement": f"records file not found: {args.records}"}, indent=2)) + sys.exit(0) + + if not records: + print(json.dumps({"status": "not_ready", "missing_requirement": "records file is empty"}, indent=2)) + sys.exit(0) + + result = run_evaluation(records, only_study=args.study) + print(json.dumps(result, indent=2)) + + +if __name__ == "__main__": + main() diff --git a/studies/study_016/materials/materials.json b/studies/study_016/materials/materials.json new file mode 100644 index 0000000..cc9656e --- /dev/null +++ b/studies/study_016/materials/materials.json @@ -0,0 +1,197 @@ +{ + "_purpose": "Participant-visible materials grouped by study and condition, for use by task/adapter.py. Every item carries an evidence_label and a source pointer into source/evidence.json (field `source`). Trait-scale anchor text for traits other than 'cooperativeness' is reconstructed by template substitution (see s1-trait-scale-example in evidence.json) and is explicitly labeled 'derived', not 'verbatim'.", + "trait_scale_template": { + "_purpose": "The paper gives full verbatim anchor wording for exactly one trait (cooperativeness, Study 1). It states all traits used the same 100-point midpoint/confidence-extremity structure: +50/-50 use an adjective form ('more cooperative'/'less cooperative') while the 0-point uses a noun form ('with respect to cooperativeness'). Substituting a single trait-name string into both forms verbatim produces ungrammatical anchors for most of the other trait names used in this paper (e.g. 'more shyness', 'more legal knowledge'). This template therefore uses a uniform 'higher/lower in {trait}' paraphrase instead of literal substitution, preserving the verbatim structure (100-point scale; midpoint = no inference; extremes = confident, extreme inference) without producing broken grammar. Every rendered instance is labeled 'derived', citing this paraphrase as the derivation, not 'verbatim'.", + "evidence_label": "verbatim", + "source": "s1-trait-scale-example", + "range": [-50, 50], + "anchor_plus50": "Certainly higher in {trait} than the average person of my age and sex, probably very much higher.", + "anchor_zero": "Probably average with respect to {trait}. I have no reason to assume that the actor differs from the average person of my age and sex with respect to this characteristic.", + "anchor_minus50": "Certainly lower in {trait} than the average person of my age and sex, probably very much lower." + }, + "study1": { + "design_note": { + "text": "Between-subjects: each participant sees exactly ONE story. n=80/story in the original study (320 total).", + "evidence_label": "verbatim", + "source": "s1-design-1" + }, + "conditions": [ + { + "condition_id": "supermarket", + "story_text": "As you are leaving your neighborhood supermarket a man in a business suit asks you whether you like shopping in that store. You reply quite honestly that you do like shopping there and indicate that in addition to being close to your home the supermarket seems to have very good meats and produce at reasonably low prices. The man then reveals that a videotape crew has filmed your comments and asks you to sign a release allowing them to use the unedited film for a TV commercial that the supermarket chain is preparing.", + "consensus_question": "What % of your peers do you estimate would sign the release? ____% What % would refuse to sign it? ____% (Total % should be 100%)", + "own_choice_options": ["sign the release", "not sign the release"], + "traits": ["shyness", "cooperativeness", "trust", "adventurousness"], + "evidence_label": "verbatim", + "source": "s1-story-supermarket" + }, + { + "condition_id": "term_paper", + "story_text": "You arrive for the first day of class in a course in your major area of study. The professor says that the grade in your course will depend on a paper due the final day of the course. He gives the class the option of two alternatives upon which they must vote. They can either do papers individually in the normal way or they can work in teams of three persons who will submit a single paper between them. You are informed that he will still give out the same number of A's, B's, and C's, etc., but that in the first case every student will be graded individually while in the second case all three students who work together get the same grade.", + "consensus_question": "What % of your peers do you estimate would vote for group papers? ____% What % would vote for individual papers? ____% (Total % should be 100%)", + "own_choice_options": ["vote for group papers", "vote for individual papers"], + "traits": ["gregariousness", "laziness", "competitiveness", "generosity"], + "evidence_label": "verbatim", + "source": "s1-story-termpaper" + }, + { + "condition_id": "traffic_ticket", + "story_text": "While driving through a rural area near your home you are stopped by a county police officer who informs you that you have been clocked (with radar) at 38 miles per hour in a 25-mph zone. You believe this information to be accurate. After the policeman leaves, you inspect your citation and find that the details on the summons regarding weather, visibility, time, and location of violation are highly inaccurate. The citation informs you that you may either pay a $20 fine by mail without appearing in court or you must appear in municipal court within the next two weeks to contest the charge.", + "consensus_question": "What % of your peers do you estimate would pay the $20 fine by mail? ____% What % would go to court to contest the charge? ____% (Total should be 100%)", + "own_choice_options": ["pay the $20 fine by mail", "go to court to contest the charge"], + "traits": ["self-confidence", "legal knowledge", "argumentativeness", "miserliness"], + "evidence_label": "verbatim", + "source": "s1-story-trafficticket" + }, + { + "condition_id": "space_program", + "story_text": "It is proposed in Congress that the space program be revived and that large sums be allocated for the manned and unmanned exploration of the moon and planets nearest Earth. Supporters of the proposal argue that it will provide jobs, spur technology, and promote national pride and unity. Opponents argue that a space program will either necessitate higher taxes, or else drain money from important domestic priorities. Furthermore, they deny that it will accomplish the desirable effects claimed by the program's supporters. Both sides, of course, refute each other's claims and ultimately a public referendum is held.", + "consensus_question": "What % of your peers do you estimate would vote for the proposed allocation of funds for space exploration? ____% What % would vote against it? ____% (Total should be 100%)", + "own_choice_options": ["vote for the space program allocation", "vote against the space program allocation"], + "traits": ["rationality", "social concern", "idealism", "selfishness"], + "evidence_label": "verbatim", + "source": "s1-story-spaceprogram", + "note": "Table 1 in the paper labels the two options 'vote for cutback' / 'vote against cutback', which is inconsistent with the story text's 'for/against the allocation' framing. Preserved as an inconsistency in the source rather than silently resolved; see s1-story-spaceprogram note in evidence.json." + } + ], + "trait_rating_instructions": { + "text": "Rate the typical person (of your own age and sex) who would choose each option on the traits listed for this story, using a -50 to +50 scale per the trait_scale_template above.", + "evidence_label": "reported", + "source": "s1-procedure-order" + } + }, + "study2": { + "design_note": { + "text": "Within-subjects: each participant sees all 34 usable items (of 35 originally administered; the Nixon-impeachment item was dropped mid-study). Half self-categorize first then estimate peer percentages; half do the reverse (order had no effect, so the adapter defaults to self-first).", + "evidence_label": "verbatim", + "source": "s2-design" + }, + "full_item_wording_status": { + "text": "The paper explicitly states the full 35-item questionnaire text is not reproduced in the report and was available only from the first author. Only the short category labels below (from Table 3) are available from this source.", + "evidence_label": "missing", + "source": "s2-questionnaire-not-reproduced" + }, + "items": [ + {"domain": "Personal traits and views", "category_1": "Shy", "category_2": "not shy", "source": "s2-table3-items-and-results", "evidence_label": "reported"}, + {"domain": "Personal traits and views", "category_1": "Optimistic", "category_2": "not optimistic", "source": "s2-table3-items-and-results", "evidence_label": "reported"}, + {"domain": "Personal traits and views", "category_1": "Competitive", "category_2": "not competitive", "source": "s2-table3-items-and-results", "evidence_label": "reported"}, + {"domain": "Personal traits and views", "category_1": "Politically left of center", "category_2": "not politically left of center", "source": "s2-table3-items-and-results", "evidence_label": "reported"}, + {"domain": "Personal traits and views", "category_1": "Supporter of women's lib", "category_2": "not a supporter of women's lib", "source": "s2-table3-items-and-results", "evidence_label": "reported"}, + {"domain": "Personal preferences", "category_1": "Prefers brown bread", "category_2": "prefers white bread", "source": "s2-table3-items-and-results", "evidence_label": "reported"}, + {"domain": "Personal preferences", "category_1": "Prefers to be alone", "category_2": "prefers to be with others", "source": "s2-table3-items-and-results", "evidence_label": "reported"}, + {"domain": "Personal preferences", "category_1": "Prefers Italian movies", "category_2": "prefers French movies", "source": "s2-table3-items-and-results", "evidence_label": "reported"}, + {"domain": "Personal preferences", "category_1": "Prefers city life", "category_2": "prefers country life", "source": "s2-table3-items-and-results", "evidence_label": "reported"}, + {"domain": "Personal preferences", "category_1": "Prefers basketball", "category_2": "prefers football", "source": "s2-table3-items-and-results", "evidence_label": "reported"}, + {"domain": "Personal characteristics", "category_1": "Male", "category_2": "female", "source": "s2-table3-items-and-results", "evidence_label": "reported"}, + {"domain": "Personal characteristics", "category_1": "Brown eyes", "category_2": "blue eyes", "source": "s2-table3-items-and-results", "evidence_label": "reported"}, + {"domain": "Personal characteristics", "category_1": "Subscribes to magazines on list provided", "category_2": "does not subscribe", "source": "s2-table3-items-and-results", "evidence_label": "reported", "note": "The specific magazine list referenced is not reproduced in the paper; marked missing."}, + {"domain": "Personal characteristics", "category_1": "First-born child", "category_2": "later-born child", "source": "s2-table3-items-and-results", "evidence_label": "reported"}, + {"domain": "Personal characteristics", "category_1": "Hometown more than 200,000 people", "category_2": "hometown less than 200,000 people", "source": "s2-table3-items-and-results", "evidence_label": "reported"}, + {"domain": "Personal problems", "category_1": "Often thinks about dying", "category_2": "does not often think about dying", "source": "s2-table3-items-and-results", "evidence_label": "reported"}, + {"domain": "Personal problems", "category_1": "Finds it hard to make friends", "category_2": "does not find it hard to make friends", "source": "s2-table3-items-and-results", "evidence_label": "reported"}, + {"domain": "Personal problems", "category_1": "Has difficulty controlling temper", "category_2": "does not have difficulty controlling temper", "source": "s2-table3-items-and-results", "evidence_label": "reported"}, + {"domain": "Personal problems", "category_1": "Frequently depressed", "category_2": "not frequently depressed", "source": "s2-table3-items-and-results", "evidence_label": "reported"}, + {"domain": "Personal problems", "category_1": "Emotional needs satisfied", "category_2": "emotional needs not satisfied", "source": "s2-table3-items-and-results", "evidence_label": "reported"}, + {"domain": "Personal activities", "category_1": "Watches TV 30+ hours/month", "category_2": "watches TV less than 30 hours/month", "source": "s2-table3-items-and-results", "evidence_label": "reported"}, + {"domain": "Personal activities", "category_1": "Plays tennis once a week", "category_2": "does not play tennis once a week", "source": "s2-table3-items-and-results", "evidence_label": "reported"}, + {"domain": "Personal activities", "category_1": "Attends religious service once a month", "category_2": "does not attend religious service once a month", "source": "s2-table3-items-and-results", "evidence_label": "reported"}, + {"domain": "Personal activities", "category_1": "Donates blood once a year", "category_2": "does not donate blood once a year", "source": "s2-table3-items-and-results", "evidence_label": "reported"}, + {"domain": "Personal activities", "category_1": "Makes a long-distance phone call once a week", "category_2": "does not make a long-distance phone call once a week", "source": "s2-table3-items-and-results", "evidence_label": "reported"}, + {"domain": "Personal expectations", "category_1": "Expects to be married by age 30", "category_2": "does not expect to be married by age 30", "source": "s2-table3-items-and-results", "evidence_label": "reported"}, + {"domain": "Personal expectations", "category_1": "Expects better financial status than parents", "category_2": "does not expect better financial status than parents", "source": "s2-table3-items-and-results", "evidence_label": "reported"}, + {"domain": "Personal expectations", "category_1": "Expects to live outside the U.S. for a year in next 20 years", "category_2": "does not expect to", "source": "s2-table3-items-and-results", "evidence_label": "reported"}, + {"domain": "Personal expectations", "category_1": "Expects great satisfaction from job or career", "category_2": "does not expect great satisfaction from job or career", "source": "s2-table3-items-and-results", "evidence_label": "reported"}, + {"domain": "Personal expectations", "category_1": "Expects death before 70th birthday", "category_2": "does not expect death before 70th birthday", "source": "s2-table3-items-and-results", "evidence_label": "reported"}, + {"domain": "Political expectations", "category_1": "Expects removal of Nixon from office", "category_2": "does not expect removal of Nixon from office", "source": "s2-table3-items-and-results", "evidence_label": "reported", "status": "DROPPED_MID_STUDY", "note": "Excluded from the 34 usable items; the paper marks this row 'Deleted'. Retained here only for completeness; adapter must skip it."}, + {"domain": "Political expectations", "category_1": "Expects a woman on the Supreme Court within a decade", "category_2": "does not expect this", "source": "s2-table3-items-and-results", "evidence_label": "reported"}, + {"domain": "Political expectations", "category_1": "Expects the poverty problem to be reduced in the next 20 years", "category_2": "does not expect this", "source": "s2-table3-items-and-results", "evidence_label": "reported"}, + {"domain": "Political expectations", "category_1": "Expects a nuclear weapon to be used in warfare in the next 10 years", "category_2": "does not expect this", "source": "s2-table3-items-and-results", "evidence_label": "reported"}, + {"domain": "Political expectations", "category_1": "Expects discovery of extraterrestrial life by year 2000", "category_2": "does not expect this", "source": "s2-table3-items-and-results", "evidence_label": "reported"} + ], + "item_count_note": { + "text": "35 items were administered; 1 (Nixon impeachment) was dropped mid-study, leaving 34 analyzed items. All 35 rows (including the dropped one) are listed above for completeness/audit purposes; task/task.json instructs the adapter to administer only the 34 non-dropped items.", + "evidence_label": "verbatim", + "source": "s2-design" + } + }, + "study3": { + "design_note": { + "text": "Between-subjects: each participant sees ONE of two sign-message versions (Eat at Joe's / Repent) of the sandwich-board story. n=104 total in the original study.", + "evidence_label": "verbatim", + "source": "s3-design" + }, + "conditions": [ + { + "condition_id": "eat_at_joes", + "story_text": "It is an official course requirement of your introductory psychology class that you participate as a subject in at least three experiments during the quarter. Sign-up sheets for experiments are posted on the bulletin board outside class which allow students to choose a time which is convenient. You decide to sign up for an experiment described as \"a study concerned with attitudes,\" and arrive at the designated time and place where you are greeted by the experimenter and thanked for coming. The experimenter then proceeds to describe his study. He explains that he is concerned with persuasion and attitude change and will be comparing various types of communication techniques. He further explains that today he needs subjects to walk around campus for 30 minutes wearing a sandwich board sign which simply says: \"Eat at Joe's\" While they are wearing this sandwich board subjects are simply to keep a record of the number of people who say something to them. They are also required to note the person's sex and whether the person's comment is positive, negative, or neutral. The experimenter makes it clear that you are not compelled to participate if you are unwilling, but that he would obviously prefer that you go along with his request to wear the sign and make the necessary observations. Subjects who decide not to participate, he explains, will be missing the chance to learn something interesting and to help the research project but they nevertheless will receive credit toward their course requirement.", + "consensus_question": "What % of your peers do you estimate would agree to carry the sandwich board around campus? ____% What % would refuse to carry it? ____% (Total should be 100%)", + "own_choice_options": ["agree to carry the sandwich board", "refuse to carry the sandwich board"], + "traits": ["cooperativeness", "shyness", "aggressiveness", "submissiveness", "attractiveness", "inquisitiveness", "uprightness", "cynicism"], + "evidence_label": "verbatim", + "source": "s3-story-eatatjoes" + }, + { + "condition_id": "repent", + "story_text": "It is an official course requirement of your introductory psychology class that you participate as a subject in at least three experiments during the quarter. Sign-up sheets for experiments are posted on the bulletin board outside class which allow students to choose a time which is convenient. You decide to sign up for an experiment described as \"a study concerned with attitudes,\" and arrive at the designated time and place where you are greeted by the experimenter and thanked for coming. The experimenter then proceeds to describe his study. He explains that he is concerned with persuasion and attitude change and will be comparing various types of communication techniques. He further explains that today he needs subjects to walk around campus for 30 minutes wearing a sandwich board sign which simply says: \"Repent\" While they are wearing this sandwich board subjects are simply to keep a record of the number of people who say something to them. They are also required to note the person's sex and whether the person's comment is positive, negative, or neutral. The experimenter makes it clear that you are not compelled to participate if you are unwilling, but that he would obviously prefer that you go along with his request to wear the sign and make the necessary observations. Subjects who decide not to participate, he explains, will be missing the chance to learn something interesting and to help the research project but they nevertheless will receive credit toward their course requirement.", + "consensus_question": "What % of your peers do you estimate would agree to carry the sandwich board around campus? ____% What % would refuse to carry it? ____% (Total should be 100%)", + "own_choice_options": ["agree to carry the sandwich board", "refuse to carry the sandwich board"], + "traits": ["cooperativeness", "shyness", "aggressiveness", "submissiveness", "attractiveness", "inquisitiveness", "uprightness", "cynicism"], + "evidence_label": "derived", + "derivation": "Sign text substituted per the paper's explicit statement that the Repent version is identical except for the sign message (s3-story-repent).", + "source": "s3-story-repent" + } + ] + }, + "study4": { + "design_note": { + "text": "Between-subjects, real (non-hypothetical) decision. In the original study, participants were physically present in groups of 2-5, completed a real 'Likes and Dislikes' questionnaire, heard the cover story delivered live by an experimenter, and made a real, consequential choice to wear or not wear a sandwich board sign around campus for 30 minutes, followed by full debriefing about the deception. A text-based agent cannot be made to actually walk around campus; this package instead administers the same textual materials (cover story script + Likes/Dislikes vignettes) and records the agent's stated choice, consensus estimate, and trait ratings, clearly labeled as a text-only reconstruction of the real-choice manipulation rather than a live behavioral replication.", + "evidence_label": "reported", + "source": "s4-design" + }, + "likes_dislikes_intro_task": { + "text": "Before hearing about the sandwich-board request, complete a 'Likes and Dislikes' questionnaire describing briefly some things you like to do and some things you dislike doing.", + "evidence_label": "reported", + "source": "s4-design" + }, + "cover_story_script": { + "text": "Let me explain what this study is all about. We're running a series of experiments about attitudes and self-perceptions. We're interested in how different types of people respond to different types of messages, depending on the medium in which they're presented. For example, we've already used telephone calls, handbills, and newspaper ads. Today we are studying another medium-a more personal one-a sandwich board sign like this one. We want to see how many people respond, who responds, and how they respond, when a message is presented on a sandwich board. We're particularly interested in what difference it makes who is carrying the sandwich board sign. What we'd like you to do today is to put on one of these sandwich boards and walk around the campus for about 30 minutes. We have a map to give you with the route outlined. We also have a tally sheet for you to carry around on which to keep track of the number of people who respond verbally and to record whether their responses are positive, negative, or neutral. If you are not willing to do this we will still give you your experimental credit although you will miss the chance to have an interesting experience and to do us a big favor. Now would you please indicate if you're willing to do the task by checking the appropriate box on the Likes and Dislikes questionnaire in front of you.", + "evidence_label": "verbatim", + "source": "s4-experimenter-script", + "note": "Paper describes the printed version as 'a slightly expanded version' of the script actually delivered aloud; the exact spoken wording used with subjects is not preserved verbatim beyond this printed version." + }, + "consensus_question": "After deciding, estimate: What % of participants like you do you think agreed to wear the sandwich board? ____% What % refused? ____% (Total should be 100%)", + "own_choice_options": ["agree to wear the sandwich board", "refuse and withdraw (still receiving course credit)"], + "target_person_materials": [ + { + "version": "A", + "likes": "to take walks, read, sculpt, run, swing, lie on the beach, and eat", + "dislikes": "being in crowds, being inside all day, feeling pressured by people, or having to make conversation", + "evidence_label": "verbatim", + "source": "s4-likes-dislikes-versionA" + }, + { + "version": "B", + "likes": "to listen, talk, laugh, bake, do arts and crafts, play with a pet dog, and tease close friends", + "dislikes": "writing term papers, sitting in dull classes, or being with badly behaved children or objectionable adults", + "evidence_label": "verbatim", + "source": "s4-likes-dislikes-versionB" + } + ], + "target_person_pairing_note": { + "text": "In the original study, roughly half of subjects saw Version A paired with 'this person agreed to wear the sign' and Version B paired with 'this person refused' (and vice versa for the remainder), counterbalanced. The adapter should randomize this pairing per run.", + "evidence_label": "verbatim", + "source": "s4-counterbalance-and-justification" + }, + "traits": { + "value": ["cooperativeness", "shyness", "aggressiveness", "submissiveness", "attractiveness", "inquisitiveness", "uprightness", "cynicism"], + "evidence_label": "missing", + "source": "s4-traits-not-listed", + "note": "The paper never explicitly states which traits were rated in Study 4. This list is carried over from Study 3 as a labeled assumption, not a verbatim or reported fact about Study 4 itself. See audit/missing_information.json entry study4-trait-list." + }, + "debriefing_note": { + "text": "In the original study, all participants were fully debriefed about the true purpose of the study and the deception involved, and reassured that either choice was reasonable. Because this package's Study 4 administration is a text-only reconstruction (no real deception of a live human participant occurs), a live debriefing step is not required for adapter.py's operation, but the researcher-facing framing must not omit this original ethical safeguard.", + "evidence_label": "verbatim", + "source": "s4-counterbalance-and-justification" + } + } +} diff --git a/studies/study_016/source/evidence.json b/studies/study_016/source/evidence.json new file mode 100644 index 0000000..e311632 --- /dev/null +++ b/studies/study_016/source/evidence.json @@ -0,0 +1,289 @@ +{ + "_purpose": "Complete evidence and provenance record. Every substantive claim or material used elsewhere in this package (study.json, materials/materials.json, task/task.json) points to an id in this file. Locations use the printed journal page number (visible in the PDF as running headers/footers, pages 279-301) plus the line range from `pdftotext -layout input/paper.pdf` performed by the package builder, so a reviewer can re-derive the same line numbers by re-running that exact command against the same PDF.", + "extraction_method": "pdftotext -layout input/paper.pdf > paper.txt; all page/line references below are against that output.", + "evidence_label_definitions": { + "verbatim": "directly quoted or transcribed from the source", + "reported": "faithfully paraphrased from the source", + "derived": "transformed from reported information with the derivation stated", + "missing": "unavailable and requiring researcher input" + }, + "items": [ + { + "id": "meta-1", + "study": "paper", + "item": "title_authors_journal", + "content": "The \"False Consensus Effect\": An Egocentric Bias in Social Perception and Attribution Processes / Lee Ross, David Greene, and Pamela House, Stanford University / Journal of Experimental Social Psychology 12, 279-301 / Received April 21, 1976", + "evidence_label": "verbatim", + "source_location": {"page": 279, "pdftotext_lines": "6-12"} + }, + { + "id": "meta-2", + "study": "paper", + "item": "abstract", + "content": "Evidence from four studies demonstrates that social observers tend to perceive a \"false consensus\" with respect to the relative commonness of their own responses... cognitive and perceptual mechanisms are proposed which might account for distortions in perceived consensus and for corresponding biases in social inference and attributional processes.", + "evidence_label": "verbatim", + "source_location": {"page": 279, "pdftotext_lines": "14-27"} + }, + { + "id": "meta-3", + "study": "paper", + "item": "acknowledgments", + "content": "The authors wish to acknowledge the contributions of Michael Fleming who helped to design and execute Study 3 and Study 4 and of Michael Hubbard who assisted in the analysis and interpretation of data from all four studies. David Greene is now at Carnegie-Mellon University.", + "evidence_label": "verbatim", + "source_location": {"page": 279, "pdftotext_lines": "46-49"} + }, + { + "id": "s1-design-1", + "study": "study1", + "item": "sample_and_design", + "content": "A total of 320 Stanford undergraduates (80 for each of the four stories) participated. Between-subjects design: each subject read exactly one of four brief hypothetical stories, then estimated the percentage of peers choosing each of two behavioral options, then reported their own choice, then rated the traits of the 'typical person' who would choose each option.", + "evidence_label": "verbatim", + "source_location": {"page": 281, "pdftotext_lines": "125-131"} + }, + { + "id": "s1-story-supermarket", + "study": "study1", + "item": "supermarket_story_and_question", + "content": "As you are leaving your neighborhood supermarket a man in a business suit asks you whether you like shopping in that store. You reply quite honestly that you do like shopping there and indicate that in addition to being close to your home the supermarket seems to have very good meats and produce at reasonably low prices. The man then reveals that a videotape crew has filmed your comments and asks you to sign a release allowing them to use the unedited film for a TV commercial that the supermarket chain is preparing. What % of your peers do you estimate would sign the release?__% What % would refuse to sign it?__% (Total % should be 100%)", + "evidence_label": "verbatim", + "source_location": {"page": 281, "pdftotext_lines": "132-144"}, + "traits_named_for_story": ["shyness", "cooperativeness", "trust", "adventurousness"] + }, + { + "id": "s1-story-termpaper", + "study": "study1", + "item": "term_paper_story_and_question", + "content": "You arrive for the first day of class in a course in your major area of study. The professor says that the grade in your course will depend on a paper due the final day of the course. He gives the class the option of two alternatives upon which they must vote. They can either do papers individually in the normal way or they can work in teams of three persons who will submit a single paper between them. You are informed that he will still give out the same number of A's, B's, and C's, etc., but that in the first case every student will be graded individually while in the second case all three students who work together get the same grade. What % of your peers do you estimate would vote for group papers?__% What % would vote for individual papers?__% (Total % should be 100%)", + "evidence_label": "verbatim", + "source_location": {"page": 281, "pdftotext_lines": "145-159"}, + "traits_named_for_story": ["gregariousness", "laziness", "competitiveness", "generosity"] + }, + { + "id": "s1-story-trafficticket", + "study": "study1", + "item": "traffic_ticket_story_and_question", + "content": "While driving through a rural area near your home you are stopped by a county police officer who informs you that you have been clocked (with radar) at 38 miles per hour in a 25-mph zone. You believe this information to be accurate. After the policeman leaves, you inspect your citation and find that the details on the summons regarding weather, visibility, time, and location of violation are highly inaccurate. The citation informs you that you may either pay a $20 fine by mail without appearing in court or you must appear in municipal court within the next two weeks to contest the charge. What % of your peers do you estimate would pay the $20 fine by mail?__% What % would go to court to contest the charge?__% (Total should be 100%)", + "evidence_label": "verbatim", + "source_location": {"page": 282, "pdftotext_lines": "160-172"}, + "traits_named_for_story": ["self-confidence", "legal knowledge", "argumentativeness", "miserliness"] + }, + { + "id": "s1-story-spaceprogram", + "study": "study1", + "item": "space_program_story_and_question", + "content": "It is proposed in Congress that the space program be revived and that large sums be allocated for the manned and unmanned exploration of the moon and planets nearest Earth. Supporters of the proposal argue that it will provide jobs, spur technology, and promote national pride and unity. Opponents argue that a space program will either necessitate higher taxes, or else drain money from important domestic priorities. Furthermore, they deny that it will accomplish the desirable effects claimed by the program's supporters. Both sides, of course, refute each other's claims and ultimately a public referendum is held. What % of your peers do you estimate would vote for the proposed allocation of funds for space exploration?__% What % would vote against it?__% (Total should be 100%)", + "evidence_label": "verbatim", + "source_location": {"page": 282, "pdftotext_lines": "173-186"}, + "traits_named_for_story": ["rationality", "social concern", "idealism", "selfishness"], + "note": "Table 1 labels the two options 'vote for cutback' / 'vote against cutback' while the story text asks about voting for/against funding allocation; this reflects the paper's own inconsistent labeling and is preserved as-is rather than silently corrected." + }, + { + "id": "s1-procedure-order", + "study": "study1", + "item": "questionnaire_structure_and_order", + "content": "After completing the relevant percentage estimates, subjects were required to fill out a three-page questionnaire: a self-description page (personal choice + Likert self-ratings) and two 'typical person' trait-rating pages (one per behavioral option). The order of the three rating sheets was systematically varied; order produced no significant effects and is not analyzed further in the paper.", + "evidence_label": "verbatim", + "source_location": {"page": 282, "pdftotext_lines": "187-201"} + }, + { + "id": "s1-trait-scale-example", + "study": "study1", + "item": "trait_rating_scale_anchors_cooperativeness", + "content": "For each trait a 100-point rating scale was used, anchored: +50 'Certainly more cooperative than the average person of my age and sex, probably very much more cooperative.' 0 'Probably average with respect to cooperativeness. I have no reason to assume that the actor differs from the average person of my age and sex with respect to this characteristic.' -50 'Certainly less cooperative than the average person of my age and sex, probably very much less cooperative.'", + "evidence_label": "verbatim", + "source_location": {"page": 283, "pdftotext_lines": "204-218"}, + "note": "This is the ONLY trait for which the paper reproduces the full anchor wording. The paper states all traits used '100-point' scales with the midpoint/extremes labeled in the same style (extremity + confidence). materials.json derives the other traits' anchors by substituting the trait name into this template; that substitution is labeled 'derived', not 'verbatim'." + }, + { + "id": "s1-hypotheses", + "study": "study1", + "item": "research_hypotheses", + "content": "1. Subjects who 'choose' a particular hypothetical response will rate that response as more probable for 'people in general' than will subjects who 'choose' the alternative response. 2. Subjects who 'choose' a specified response will use less extreme and less confident trait ratings in characterizing a 'typical' person making that response than will subjects who 'choose' the alternative response.", + "evidence_label": "verbatim", + "source_location": {"page": 283, "pdftotext_lines": "219-226"} + }, + { + "id": "s1-table1-results", + "study": "study1", + "item": "perceived_consensus_results_table1", + "content": "Table 1 (Perceived Consensus, Study 1): Supermarket story — sign release n=53 (66%), estimate 75.6% sign/24.4% refuse; not sign n=27 (34%), estimate 57.3%/42.7%; F(1,78 implied)=17.7. Term paper — choose individual n=64 (80%), 67.4%/32.6%; choose group n=16 (20%), 45.9%/54.1%; F=16.5. Traffic ticket — pay fine n=37 (46%), 71.8%/28.2%; contest n=43 (54%), 51.7%/48.3%; F=12.8. Space program — vote for cutback n=32 (40%), 47.9%/52.1%; vote against n=48 (60%), 39.0%/61.0%; F=4.9. Combined across 4 stories: choose option1 n=186 (58%) est. 65.7%/34.3%; choose option2 n=134 (42%) est. 48.5%/51.5%; F(1,312)=49.1, p<.001 (main effect of Rater's Choice); Story x Rater's Choice interaction F(1,312)=1.37, p>.10.", + "evidence_label": "verbatim", + "source_location": {"page": 283, "pdftotext_lines": "228-271"} + }, + { + "id": "s1-table2-trait-note", + "study": "study1", + "item": "trait_ratings_table_reference", + "content": "The paper's trait-ratings table for Study 1 is labeled 'Table 3' in the printed text (an apparent numbering artifact/typo in the original — it appears between the Study 1 results narrative and before the Study 2 table, which is also labeled 'Table 3'). Reported here as it appears: absolute discrepancy scores from the midpoint, by story: Supermarket F(1,78)=17.27,p<.001; Term paper F=21.83,p<.001; Traffic ticket F=3.18,p<.10 (marginal); Space program F=1.81,p<.10 (n.s.). Combined 4-story ANOVA: main effect of Rater's Own Choice F(1,312)=37.40,p<.001; Story x Choice interaction F(3,312)=3.71,p<.05.", + "evidence_label": "verbatim", + "source_location": {"page": 284, "pdftotext_lines": "272-337"}, + "note": "OCR of the numeric table cells (lines 284-309) is degraded ('x9 5', 'IOO-point', etc. elsewhere) — the narrative F-ratios and p-values quoted in body text (lines 324-337) are used here in preference to the raw OCR'd table cells, which are not independently re-derivable from this PDF without better OCR. Cell-level per-trait numbers are marked 'missing' in audit/missing_information.json." + }, + { + "id": "s2-design", + "study": "study2", + "item": "sample_and_procedure", + "content": "80 Stanford undergraduates completed a questionnaire covering 35 person-description items (Table 3), each a pair of mutually exclusive/exhaustive categories. Half of subjects self-categorized first then estimated the % of 'college students in general' in each category; the other half answered in reverse order (order produced no relevant effects). One item (Nixon impeachment) became unusable mid-study, leaving 34 usable items.", + "evidence_label": "verbatim", + "source_location": {"page": 285, "pdftotext_lines": "358-377"} + }, + { + "id": "s2-questionnaire-not-reproduced", + "study": "study2", + "item": "full_questionnaire_availability", + "content": "\"The full text of this questionnaire is too lengthy to be reproduced in the present report, although Table 3 does list all of the relevant personal description categories. The questionnaire itself may be obtained from the first author.\"", + "evidence_label": "verbatim", + "source_location": {"page": 286, "pdftotext_lines": "402-404"}, + "note": "This is the paper's own explicit statement that verbatim item wording (beyond the short category labels in Table 3) is not available in this source. Full item stems are therefore marked 'missing' in materials.json and audit/missing_information.json; only the category labels are usable, and only as 'reported' short labels." + }, + { + "id": "s2-table3-items-and-results", + "study": "study2", + "item": "personal_description_categories_and_estimates", + "content": "Table 3 lists 35 category-pair items (categories in parens are the alternative) grouped into 7 domains (Personal traits and views; Personal preferences; Personal characteristics; Personal problems; Personal activities; Personal expectations; Political expectations), each with the mean % estimate of 'college students in category 1' given by raters who placed themselves in category 1 vs. category 2, and a significance marker. Example rows: 'Shy (not shy)' 45.9 vs 35.9, t=2.66,p<.01 [marker key: * p<.10, dagger p<.05, double-dagger p<.01, section-mark p<.001]; 'Supporter of women's lib (not)' 57.3 vs 33.4; 'Woman in Supreme Court within decade? yes(no)' 63.3 vs 34.6, t=6.19,p<.001; 'Removal of Nixon from office? yes(no)' marked 'Deleted' (the unusable item). Overall: predicted-direction difference held for 32 of 34 usable items; 17 significant beyond .10, 11 of those beyond .01.", + "evidence_label": "verbatim", + "source_location": {"page": 287, "pdftotext_lines": "407-499"}, + "note": "Table OCR is partially degraded for several numeric cells (e.g. digits rendered as letters, 'x' for numerals in some rows on pages 287-288). Row category labels and the qualitative summary in body text (lines 373-389, 501-522) are reliable; a handful of individual cell values are approximate/uncertain due to OCR artifacts and are flagged in audit/missing_information.json rather than silently corrected." + }, + { + "id": "s2-domain-summary", + "study": "study2", + "item": "results_by_domain", + "content": "Strongest/most consistent support: Political Expectations domain (women on Supreme Court, poverty abating, nuclear weapon use, extraterrestrial life) and reasonably consistent support from Personal Traits/Views and Personal Problems. Sporadic support: Personal Preferences, Personal Characteristics, Personal Expectations. No significant support: Personal Activities (e.g., TV watching, tennis).", + "evidence_label": "verbatim", + "source_location": {"page": 286, "pdftotext_lines": "390-515"} + }, + { + "id": "s3-design", + "study": "study3", + "item": "sample_and_procedure", + "content": "104 Stanford undergraduates read one of two versions of a hypothetical sandwich-board story (differing only in the sign message: 'Eat at Joe's' vs 'Repent'), then indicated their own choice (wear / not wear), estimated peer consensus, and rated 8 traits (cooperativeness, shyness, aggressiveness, submissiveness, attractiveness, inquisitiveness, uprightness, cynicism) for the 'typical' person who would wear vs. not wear the sign. Rating-order was counterbalanced with no effect.", + "evidence_label": "verbatim", + "source_location": {"page": 289, "pdftotext_lines": "559-606"} + }, + { + "id": "s3-story-eatatjoes", + "study": "study3", + "item": "sandwich_board_story_eat_at_joes", + "content": "It is an official course requirement of your introductory psychology class that you participate as a subject in at least three experiments during the quarter. Sign-up sheets for experiments are posted on the bulletin board outside class which allow students to choose a time which is convenient. You decide to sign up for an experiment described as \"a study concerned with attitudes,\" and arrive at the designated time and place where you are greeted by the experimenter and thanked for coming. The experimenter then proceeds to describe his study. He explains that he is concerned with persuasion and attitude change and will be comparing various types of communication techniques. He further explains that today he needs subjects to walk around campus for 30 minutes wearing a sandwich board sign which simply says: \"Eat at Joe's\" While they are wearing this sandwich board subjects are simply to keep a record of the number of people who say something to them. They are also required to note the person's sex and whether the person's comment is positive, negative, or neutral. The experimenter makes it clear that you are not compelled to participate if you are unwilling, but that he would obviously prefer that you go along with his request to wear the sign and make the necessary observations. Subjects who decide not to participate, he explains, will be missing the chance to learn something interesting and to help the research project but they nevertheless will receive credit toward their course requirement. What % of your peers do you estimate would agree to carry the sandwich board around campus?__% What % would refuse to carry it?__% (Total should be 100%)", + "evidence_label": "verbatim", + "source_location": {"page": 289, "pdftotext_lines": "563-590"} + }, + { + "id": "s3-story-repent", + "study": "study3", + "item": "sandwich_board_story_repent", + "content": "\"The second version of the story differed only in that the relevant sign read 'Repent,' rather than 'Eat at Joe's.'\" All other story text and the consensus question are identical to s3-story-eatatjoes with 'Repent' substituted for the sign message.", + "evidence_label": "derived", + "derivation": "Paper states explicitly that only the sign text differs between versions; materials.json reconstructs the Repent version by substituting the sign message into the verbatim Eat-at-Joe's template per the paper's own description.", + "source_location": {"page": 290, "pdftotext_lines": "591-595"} + }, + { + "id": "s3-table4-results", + "study": "study3", + "item": "perceived_consensus_results_table4_study3", + "content": "Table 4 (Study 3): Eat at Joe's — wear sign n=27 (53%) est. 64.6% wear/35.4% not; not wear n=24 (47%) est. 31.2%/68.8%; F=33.3. Repent — wear n=27 (51%) est. 58.3%/41.7%; not wear n=26 (49%) est. 29.7%/70.3%; F=23.5. Combined — wear n=54 (52%) est. 61.4%/38.2%; not wear n=50 (48%) est. 30.4%/69.6%; F=56.2.", + "evidence_label": "verbatim", + "source_location": {"page": 292, "pdftotext_lines": "703-720"} + }, + { + "id": "s3-table5-trait-results", + "study": "study3", + "item": "trait_rating_results_table5_study3", + "content": "Table 5 (Study 3) trait-rating differences (rated wear-sign minus not-wear-sign target, combined discrepancy score): Eat at Joe's — subjects who wore sign (n=27): 123.4 vs 124.7, diff -1.3, t=8.53; subjects who refused (n=24): 183.6 vs 117.1, diff +66.5. Repent — wore (n=27): 143.2 vs 140.5, diff +2.7, t=9.74; refused (n=26): 155.5 vs 101.3, diff +54.2. Combined — wore (n=54): 133.3 vs 132.6, diff +0.7, t=17.79; refused (n=50): 169.6 vs 109.2, diff +60.4.", + "evidence_label": "verbatim", + "source_location": {"page": 294, "pdftotext_lines": "789-798"}, + "note": "Several individual OCR'd digits in this region of the PDF are degraded (e.g. stray characters in Table 5 cells on page 294); values are transcribed as best-effort from pdftotext output and cross-checked against the narrative text (lines 745-777) which states the qualitative pattern is 'remarkably similar' between wear/not-wear groups in direction." + }, + { + "id": "s4-design", + "study": "study4", + "item": "sample_and_procedure", + "content": "80 Stanford undergraduates, in groups of 2-5, volunteered for a study framed as being about 'communication techniques.' They first completed a 'Likes and Dislikes' questionnaire, then heard the experimenter's cover story and request to wear a sandwich board sign around campus for 30 minutes, then privately indicated their own choice (wear / withdraw) by checking a box. They then made consensus estimates about their own choice and rated the traits of two ostensibly real prior participants (using contrived 'Likes and Dislikes' questionnaires, Version A and Version B) who had supposedly agreed and refused, respectively (counterbalanced). All subjects were fully debriefed afterward about the true purpose and the deception involved.", + "evidence_label": "verbatim", + "source_location": {"page": 289, "pdftotext_lines": "607-685"} + }, + { + "id": "s4-experimenter-script", + "study": "study4", + "item": "cover_story_script", + "content": "\"Let me explain what this study is all about. We're running a series of experiments about attitudes and self-perceptions. We're interested in how different types of people respond to different types of messages, depending on the medium in which they're presented. For example, we've already used telephone calls, handbills, and newspaper ads. Today we are studying another medium-a more personal one-a sandwich board sign like this one. We want to see how many people respond, who responds, and how they respond, when a message is presented on a sandwich board. We're particularly interested in what difference it makes who is carrying the sandwich board sign. What we'd like you to do today is to put on one of these sandwich boards and walk around the campus for about 30 minutes. We have a map to give you with the route outlined. We also have a tally sheet for you to carry around on which to keep track of the number of people who respond verbally and to record whether their responses are positive, negative, or neutral. If you are not willing to do this we will still give you your experimental credit although you will miss the chance to have an interesting experience and to do us a big favor. Now would you please indicate if you're willing to do the task by checking the appropriate box on the Likes and Dislikes questionnaire in front of you.\" (paper notes this is 'a slightly expanded version' of the actual script actually delivered)", + "evidence_label": "verbatim", + "source_location": {"page": 290, "pdftotext_lines": "617-636"} + }, + { + "id": "s4-likes-dislikes-versionA", + "study": "study4", + "item": "target_person_questionnaire_version_A", + "content": "Version A suggested that the person whose traits were to be rated liked \"to take walks, read, sculpt, run, swing, lie on the beach, and eat\" and disliked \"being in crowds, being inside all day, feeling pressured by people, or having to make conversation.\"", + "evidence_label": "verbatim", + "source_location": {"page": 291, "pdftotext_lines": "649-652"} + }, + { + "id": "s4-likes-dislikes-versionB", + "study": "study4", + "item": "target_person_questionnaire_version_B", + "content": "Version B suggested that the target person liked \"to listen, talk, laugh, bake, do arts and crafts, play with a pet dog, and tease close friends\" but disliked \"writing term papers, sitting in dull classes, or being with badly behaved children or objectionable adults.\"", + "evidence_label": "verbatim", + "source_location": {"page": 291, "pdftotext_lines": "652-655"} + }, + { + "id": "s4-counterbalance-and-justification", + "study": "study4", + "item": "version_pairing_and_cover_rationale", + "content": "Roughly half of subjects received Version A paired with the target's expressed agreement to wear the sign and Version B with refusal; the remainder received the opposite pairing. The experimenter told subjects the consensus/trait measures would 'help us to interpret the results of our communication study... by telling us something about the kind of people who agree or refuse to take part' — in fact this was the true dependent measure. Debriefing followed, and subjects were asked not to discuss the procedure with peers.", + "evidence_label": "verbatim", + "source_location": {"page": 291, "pdftotext_lines": "656-684"} + }, + { + "id": "s4-traits-not-listed", + "study": "study4", + "item": "trait_list_for_study4", + "content": "Study 4's methods section does not re-state which specific traits were rated (unlike Study 1 and Study 3, which name traits explicitly). The results narrative (Table 5, combined with Study 3) is described as showing a pattern 'remarkably similar' to Study 3.", + "evidence_label": "missing", + "source_location": {"page": 291, "pdftotext_lines": "641-646"}, + "note": "materials.json offers the Study 3 eight-trait list for Study 4 administration ONLY as a clearly labeled 'derived/assumed' fallback, since the paper never explicitly confirms the same 8 traits were used in Study 4. This assumption is also logged in audit/missing_information.json." + }, + { + "id": "s4-table4-results", + "study": "study4", + "item": "perceived_consensus_results_table4_study4", + "content": "Table 4 (Study 4): Eat at Joe's — wear n=28 (70%) est. 60.8%/39.2%; not wear n=12 (30%) est. 43.3%/56.7%; F=4.0. Repent — wear n=20 (50%) est. 63.5%/36.5%; not wear n=20 (50%) est. 23.3%/76.6%; F=34.14. Combined — wear n=48 (60%) est. 62.2%/37.8%; not wear n=32 (40%) est. 33.0%/67.0%; F=26.47.", + "evidence_label": "verbatim", + "source_location": {"page": 292, "pdftotext_lines": "721-727"} + }, + { + "id": "s4-table5-trait-results", + "study": "study4", + "item": "trait_rating_results_table5_study4", + "content": "Table 5 (Study 4): Eat at Joe's — wore (n=28): 115.4 vs 119.8, diff -4.4, t=4.37; refused (n=12): 155.8 vs 121.3, diff +34.5. Repent — wore (n=20): 124.9 vs 130.8, diff -5.9, t=3.93; refused (n=20): 123.5 vs 92.3, diff +31.2. Combined — wore (n=48): 120.1 vs 125.3, diff -5.2, t=8.93; refused (n=32): 139.7 vs 106.8, diff +32.9.", + "evidence_label": "verbatim", + "source_location": {"page": 294, "pdftotext_lines": "800-808"} + }, + { + "id": "discussion-covariance", + "study": "paper", + "item": "covariance_analysis_consensus_vs_trait_ratings", + "content": "Analyses of covariance (treating consensus estimates as covariate) reduced but did not eliminate the effect of own choice on trait ratings for the Supermarket and Term Paper stories (Study 1): F(1,37)=7.90,p<.01 and F(1,37)=8.91,p<.01 respectively; remained non-significant for the other Study 1 stories and for Studies 3/4. Within-choice-group correlations between perceived consensus and trait ratings were consistently negative, r=-.09 to r=-.64, median r=-.34.", + "evidence_label": "verbatim", + "source_location": {"page": 296, "pdftotext_lines": "890-928"} + }, + { + "id": "discussion-mechanisms", + "study": "paper", + "item": "proposed_mechanisms", + "content": "Three families of proposed mechanisms: (1) motivational/ego-defensive factors (justifying own choice as rational rather than dispositional); (2) selective exposure and availability (biased social sampling; easier recall/imagination of one's own chosen behavior); (3) ambiguity resolution (idiosyncratic interpretation of vague situational details affecting both one's own choice and one's estimate of others' choices in the same direction).", + "evidence_label": "verbatim", + "source_location": {"page": 297, "pdftotext_lines": "947-1050"} + }, + { + "id": "refs-1", + "study": "paper", + "item": "reference_list", + "content": "Full reference list as printed (32 references, Bramel 1962/1963 through Wallen 1941/1943), transcribed via pdftotext.", + "evidence_label": "verbatim", + "source_location": {"page": 300, "pdftotext_lines": "1072-1140"}, + "note": "Not independently verified against external bibliographic databases; network research was not authorized for this job." + } + ] +} diff --git a/studies/study_016/source/paper_metadata.json b/studies/study_016/source/paper_metadata.json new file mode 100644 index 0000000..903c05a --- /dev/null +++ b/studies/study_016/source/paper_metadata.json @@ -0,0 +1,30 @@ +{ + "_purpose": "Bibliographic record for the source paper and a log of any externally-authorized sources consulted while building this package. Since no external URL was supplied for this job, external_sources is empty and everything in this package was built from the uploaded PDF only.", + "title": "The \"False Consensus Effect\": An Egocentric Bias in Social Perception and Attribution Processes", + "authors": [ + "Lee Ross", + "David Greene", + "Pamela House" + ], + "affiliation_note": "Stanford University; David Greene's affiliation at time of publication is noted in the paper as Carnegie-Mellon University.", + "journal": "Journal of Experimental Social Psychology", + "volume_pages": "12, 279-301", + "year": 1977, + "received_date": "1976-04-21", + "source_file": "input/paper.pdf", + "original_filename": "4705-Ross-et-al-False-Consensus-Effect.pdf", + "extraction_tool": "pdftotext -layout", + "evidence_label": "verbatim", + "evidence_note": "Title, authors, journal, volume/pages, and received date are transcribed directly from the PDF's first two pages (see source/evidence.json items meta-1 and meta-2).", + "acknowledgments": "The authors acknowledge Michael Fleming (helped design and execute Study 3 and Study 4) and Michael Hubbard (assisted in analysis and interpretation of data from all four studies).", + "external_research_policy": { + "external_url_supplied_by_user": false, + "network_research_authorized": false, + "statement": "No OSF or open-materials URL was supplied in job.json for this job. Per the required process, network research (web search, web fetch, DOI resolution, OSF/repository discovery, author-page lookup) was not performed. This package was built exclusively from input/paper.pdf." + }, + "external_sources": [], + "related_works_cited_in_paper_not_verified_externally": [ + "Fields, J. & Schuman, H. (unpublished manuscript) \"Public Beliefs about the Beliefs of the Public,\" Institute for Survey Research, University of Michigan — cited in-text as extending the false consensus phenomenon; not independently retrieved.", + "Full reference list appears verbatim in source/evidence.json (item refs-1); not independently verified against external databases because network research was not authorized." + ] +} diff --git a/studies/study_016/study.json b/studies/study_016/study.json new file mode 100644 index 0000000..cbcdcaa --- /dev/null +++ b/studies/study_016/study.json @@ -0,0 +1,95 @@ +{ + "_purpose": "Researcher-facing overview of this package: the paper, its four empirical studies, participant flow, conditions, outcomes, entry point, and readiness status.", + "paper": { + "title": "The \"False Consensus Effect\": An Egocentric Bias in Social Perception and Attribution Processes", + "authors": [ + "Lee Ross", + "David Greene", + "Pamela House" + ], + "year": 1977, + "journal": "Journal of Experimental Social Psychology, 12, 279-301", + "source_pdf": "input/paper.pdf", + "metadata_file": "source/paper_metadata.json" + }, + "external_sources_consulted": [], + "external_source_policy_statement": "No OSF or open-materials URL was supplied for this job. Per the required process, no web search, web fetch, DOI resolution, or repository/author-page lookup was performed. This package is built entirely from the uploaded PDF (input/paper.pdf).", + "empirical_studies": [ + { + "study_id": "study1", + "name": "Hypothetical-story questionnaire (4 stories)", + "n": 320, + "design": "Between-subjects; 80 subjects per story (Supermarket, Term Paper, Traffic Ticket, Space Program). Each subject: (1) estimates % of peers choosing each of two behavioral options, (2) reports own choice, (3) rates a 'typical person' who would choose each option on 4 story-specific traits, -50 to +50.", + "sample": "Stanford undergraduates", + "key_findings": "Own choice predicted consensus estimates for all 4 stories (combined F(1,312)=49.1, p<.001) and predicted trait-rating extremity (combined F(1,312)=37.40, p<.001), with a significant Story x Choice interaction on the trait measure (F(3,312)=3.71, p<.05).", + "materials_status": "Full story text and consensus questions are verbatim from the paper. Trait names per story are verbatim. Trait-scale anchor wording is verbatim ONLY for the 'cooperativeness' example; other traits use a labeled paraphrase template (see materials/materials.json and audit/missing_information.json)." + }, + { + "study_id": "study2", + "name": "35-item (34 usable) self/peer categorization questionnaire", + "n": 80, + "design": "Within-subjects; every subject rated themselves and estimated 'college students in general' on 35 dichotomous personal-description items across 7 domains. 1 item (Nixon impeachment) was dropped mid-study, leaving 34 analyzed items. Order of self-vs-peer questions was counterbalanced with no effect.", + "sample": "Stanford undergraduates", + "key_findings": "32 of 34 items showed the predicted direction (self-categorized group estimates a higher peer percentage in their own category); 17 significant beyond .10, 11 of those beyond .01. Strongest support: Political Expectations domain; weakest/no support: Personal Activities domain.", + "materials_status": "Only short category labels survive in the source (paper explicitly states the full questionnaire was not reproduced and was available only from the first author). Category labels are 'reported' paraphrases of Table 3, not verbatim item stems. See audit/missing_information.json." + }, + { + "study_id": "study3", + "name": "Hypothetical sandwich-board-sign story (2 sign versions)", + "n": 104, + "design": "Between-subjects; subjects read one of two versions (sign reads 'Eat at Joe's' or 'Repent') of a story about being asked to wear a sandwich board around campus for a psychology-course experiment. Subjects report own choice, estimate peer consensus, and rate a typical wear/not-wear actor on 8 traits.", + "sample": "Stanford undergraduates", + "key_findings": "Consensus effect confirmed for both sign versions (combined F=56.2). Trait-rating pattern showed refusers making much stronger disposition inferences about wearers than vice versa (combined difference scores: wearers rated +0.7, refusers rated +60.4; t=17.79).", + "materials_status": "Eat-at-Joe's version is verbatim. Repent version's story body is derived by substituting the sign text per the paper's explicit statement that only the sign message differs." + }, + { + "study_id": "study4", + "name": "Real (non-hypothetical) sandwich-board-sign choice", + "n": 80, + "design": "Between-subjects, real behavioral choice with deception. Subjects completed a 'Likes and Dislikes' questionnaire, heard a live cover story, privately chose to wear or refuse the sign, then rated two purportedly real prior participants (using contrived Likes/Dislikes vignettes, Versions A and B, counterbalanced with the agree/refuse outcome) on presumably the same 8 traits as Study 3. All subjects were fully debriefed about the deception afterward.", + "sample": "Stanford undergraduates, run in groups of 2-5", + "key_findings": "Consensus effect replicated with real choices (combined F=26.47). Trait-rating pattern was 'remarkably similar' to Study 3 despite the real target individuals and real personal choices (combined difference scores: wearers -5.2, refusers +32.9; t=8.93).", + "materials_status": "Cover-story script and both Likes/Dislikes vignettes are verbatim. The specific trait list for Study 4 is NOT stated in the paper and is carried over from Study 3 as a labeled assumption. This study's real behavioral/deception manipulation cannot be faithfully run by a text-only agent; see task/task.json study4.blocking_reason and audit/missing_information.json." + } + ], + "participant_flow_summary": "Each package invocation of task/adapter.py plays ONE simulated participant through exactly one (study, condition) cell: read materials -> report own choice -> estimate peer consensus -> rate trait(s) of typical/target actor(s) (study2 instead: self-categorize + estimate peer % per item). Group-level replication of the paper's hypotheses requires running many such invocations per condition and feeding the resulting JSON-lines records to evaluation/evaluation.py.", + "conditions_overview": { + "study1": [ + "supermarket", + "term_paper", + "traffic_ticket", + "space_program" + ], + "study2": [ + "self_first", + "peer_first" + ], + "study3": [ + "eat_at_joes", + "repent" + ], + "study4": [ + "generic" + ] + }, + "outcomes_measured": [ + "own_choice (categorical)", + "consensus_estimate (percentage of peers per option, sums to 100)", + "trait_ratings (per trait, per target option/person, -50 to +50; extremity = |rating|)", + "study2 only: self_category and peer_estimate_pct per item" + ], + "package_entry_point": "task/adapter.py", + "evaluation_entry_point": "evaluation/evaluation.py", + "readiness_status": { + "study1": "ready", + "study2": "ready_with_caveats — category labels only, not verbatim item text; see audit/missing_information.json", + "study3": "ready", + "study4": "blocked_partial — text-only reconstruction of a real-choice/deception design; not a behavioral replication", + "overall": "runnable end-to-end (adapter.py --smoke-test passes for all study/condition cells); researcher review of audit/missing_information.json is required before treating results as a full faithful replication" + }, + "contributors": [ + { + "name": "test" + } + ] +} diff --git a/studies/study_016/task/__pycache__/adapter.cpython-311.pyc b/studies/study_016/task/__pycache__/adapter.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dbb670bd6c042b260f40e6ef5848c6fb41543199 GIT binary patch literal 21113 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 literal 0 HcmV?d00001 diff --git a/studies/study_016/task/adapter.py b/studies/study_016/task/adapter.py new file mode 100644 index 0000000..3949f52 --- /dev/null +++ b/studies/study_016/task/adapter.py @@ -0,0 +1,344 @@ +#!/usr/bin/env python3 +""" +Adapter for the Ross, Greene, & House (1977) "False Consensus Effect" package. + +Runs fully offline. Presents one (study, condition) cell of materials to a +participant (human or agent), collects a structured response, validates it, +and emits a single JSON response record. Use --smoke-test to verify the whole +pipeline (materials loading, prompt construction, validation) with synthetic +responses and no external input. + +Typical use by an agent-participant: + python3 adapter.py --study study1 --condition supermarket --print-prompt + # agent reads the printed prompt, forms its answer as JSON, then: + python3 adapter.py --study study1 --condition supermarket \ + --response-file my_response.json --out record.json +""" +import argparse +import json +import random +import sys +from pathlib import Path + +HERE = Path(__file__).resolve().parent +PACKAGE_ROOT = HERE.parent + +TASK_PATH = HERE / "task.json" +MATERIALS_PATH = PACKAGE_ROOT / "materials" / "materials.json" + +STUDY2_EXCLUDED_CATEGORY_1 = "Expects removal of Nixon from office" + + +def load_json(path): + with open(path, "r", encoding="utf-8") as f: + return json.load(f) + + +def render_trait_anchors(trait, template): + return { + "+50": template["anchor_plus50"].format(trait=trait), + "0": template["anchor_zero"].format(trait=trait), + "-50": template["anchor_minus50"].format(trait=trait), + } + + +def get_condition(materials, study_id, condition_id): + if study_id in ("study1", "study3"): + conditions = materials[study_id]["conditions"] + for c in conditions: + if c["condition_id"] == condition_id: + return c + raise KeyError(f"unknown condition_id {condition_id!r} for {study_id}") + if study_id == "study2": + if condition_id not in ("self_first", "peer_first"): + raise KeyError(f"unknown condition_id {condition_id!r} for study2") + return {"condition_id": condition_id} + if study_id == "study4": + if condition_id != "generic": + raise KeyError(f"unknown condition_id {condition_id!r} for study4") + return {"condition_id": "generic"} + raise KeyError(f"unknown study_id {study_id!r}") + + +def build_prompt(study_id, condition_id, materials): + """Return a dict of participant-facing text/questions for this cell. + No hidden instructions are injected; every field here traces to materials.json.""" + template = materials["trait_scale_template"] + + if study_id == "study1": + cond = get_condition(materials, study_id, condition_id) + traits = {t: render_trait_anchors(t, template) for t in cond["traits"]} + return { + "story_text": cond["story_text"], + "consensus_question": cond["consensus_question"], + "own_choice_options": cond["own_choice_options"], + "trait_scales": traits, + "instructions": ( + "First state which option you personally would choose. " + "Then estimate the percentage of your peers who would choose each option " + "(the two percentages must sum to 100). Then rate the 'typical person' who " + "would choose each option on each listed trait, from -50 to +50, using the " + "anchors given." + ), + } + + if study_id == "study2": + items = [ + it for it in materials["study2"]["items"] + if it["category_1"] != STUDY2_EXCLUDED_CATEGORY_1 + ] + order = condition_id if condition_id in ("self_first", "peer_first") else "self_first" + return { + "items": [ + {"index": i, "category_1": it["category_1"], "category_2": it["category_2"], "domain": it["domain"]} + for i, it in enumerate(items) + ], + "order": order, + "instructions": ( + "For each item, first indicate which category applies to you personally, then " + "estimate the percentage of 'college students in general' who fall into category_1 " + "(order reversed if order == 'peer_first')." + ), + "faithfulness_caveat": ( + "The source paper does not reproduce full item wording, only these short category " + "labels (evidence_label='reported'/'missing' — see materials.json study2.full_item_wording_status). " + "Treat each item as 'are you best described by category_1 or category_2?'." + ), + } + + if study_id == "study3": + cond = get_condition(materials, study_id, condition_id) + traits = {t: render_trait_anchors(t, template) for t in cond["traits"]} + return { + "story_text": cond["story_text"], + "consensus_question": cond["consensus_question"], + "own_choice_options": cond["own_choice_options"], + "trait_scales": traits, + "instructions": ( + "First state which option you personally would choose. Then estimate the " + "percentage of your peers who would choose each option (summing to 100). Then " + "rate the typical person who would choose each option on each listed trait, " + "-50 to +50." + ), + } + + if study_id == "study4": + s4 = materials["study4"] + versions = list(s4["target_person_materials"]) + random.shuffle(versions) + agreed_version, refused_version = versions[0], versions[1] + traits = {t: render_trait_anchors(t, template) for t in s4["traits"]["value"]} + return { + "likes_dislikes_intro": s4["likes_dislikes_intro_task"]["text"], + "cover_story_script": s4["cover_story_script"]["text"], + "own_choice_options": s4["own_choice_options"], + "consensus_question": s4["consensus_question"], + "target_persons": { + "agreed_to_wear_sign": {"likes": agreed_version["likes"], "dislikes": agreed_version["dislikes"], "version": agreed_version["version"]}, + "refused_to_wear_sign": {"likes": refused_version["likes"], "dislikes": refused_version["dislikes"], "version": refused_version["version"]}, + }, + "trait_scales": traits, + "instructions": ( + "State which choice you personally would make. Estimate the percentage of " + "participants like you who would agree vs. refuse (summing to 100). Then rate " + "each of the two target persons described above on each listed trait, -50 to +50." + ), + "faithfulness_caveat": ( + "This is a text-only reconstruction of Study 4's real-choice manipulation " + "(see materials.json study4.design_note and task.json study4.blocking_reason). " + "It is NOT a live behavioral replication: no real 30-minute campus walk, no " + "live experimenter, and no genuine deception/debriefing occur here. Also, the " + "8-trait list is an assumption carried over from Study 3 " + "(evidence_label='missing', materials.json study4.traits)." + ), + } + + raise KeyError(f"unknown study_id {study_id!r}") + + +def validate_response(study_id, condition_id, response, materials): + """Return (ok: bool, errors: list[str]).""" + errors = [] + if not isinstance(response, dict): + return False, ["response must be a JSON object"] + + if study_id in ("study1", "study3", "study4"): + options = None + if study_id == "study1": + options = get_condition(materials, study_id, condition_id)["own_choice_options"] + elif study_id == "study3": + options = get_condition(materials, study_id, condition_id)["own_choice_options"] + else: + options = materials["study4"]["own_choice_options"] + + own_choice = response.get("own_choice") + if own_choice not in options: + errors.append(f"own_choice must be one of {options}, got {own_choice!r}") + + estimate = response.get("consensus_estimate") + if not isinstance(estimate, dict) or len(estimate) != 2: + errors.append("consensus_estimate must be an object with exactly the two option percentages") + else: + keys_ok = set(estimate.keys()) == set(options) + if not keys_ok: + errors.append(f"consensus_estimate keys must be exactly {options}") + else: + try: + total = sum(float(v) for v in estimate.values()) + if abs(total - 100.0) > 0.5: + errors.append(f"consensus_estimate percentages must sum to 100, got {total}") + except (TypeError, ValueError): + errors.append("consensus_estimate values must be numeric") + + trait_ratings = response.get("trait_ratings") + if not isinstance(trait_ratings, dict): + errors.append("trait_ratings must be an object") + else: + for trait, ratings in trait_ratings.items(): + if not isinstance(ratings, dict): + errors.append(f"trait_ratings[{trait}] must be an object") + continue + for target, val in ratings.items(): + try: + fv = float(val) + if fv < -50 or fv > 50: + errors.append(f"trait_ratings[{trait}][{target}]={fv} out of [-50,50]") + except (TypeError, ValueError): + errors.append(f"trait_ratings[{trait}][{target}] must be numeric") + + elif study_id == "study2": + self_category = response.get("self_category") + peer_estimate_pct = response.get("peer_estimate_pct") + if not isinstance(self_category, list) or not self_category: + errors.append("self_category must be a non-empty list") + if not isinstance(peer_estimate_pct, list) or not peer_estimate_pct: + errors.append("peer_estimate_pct must be a non-empty list") + if isinstance(peer_estimate_pct, list): + for row in peer_estimate_pct: + pct = row.get("pct_category_1") if isinstance(row, dict) else None + try: + fv = float(pct) + if fv < 0 or fv > 100: + errors.append(f"pct_category_1={fv} out of [0,100]") + except (TypeError, ValueError): + errors.append(f"peer_estimate_pct row missing numeric pct_category_1: {row!r}") + else: + errors.append(f"unknown study_id {study_id!r}") + + return (len(errors) == 0), errors + + +def synthetic_response(study_id, condition_id, materials): + """Deterministic canned response used only by --smoke-test, never presented as real data.""" + if study_id in ("study1", "study3"): + cond = get_condition(materials, study_id, condition_id) + opts = cond["own_choice_options"] + return { + "own_choice": opts[0], + "consensus_estimate": {opts[0]: 60.0, opts[1]: 40.0}, + "trait_ratings": {t: {opts[0]: 5.0, opts[1]: -5.0} for t in cond["traits"]}, + } + if study_id == "study4": + opts = materials["study4"]["own_choice_options"] + traits = materials["study4"]["traits"]["value"] + return { + "own_choice": opts[0], + "consensus_estimate": {opts[0]: 55.0, opts[1]: 45.0}, + "trait_ratings": {t: {"agreed_to_wear_sign": 3.0, "refused_to_wear_sign": -3.0} for t in traits}, + } + if study_id == "study2": + items = [it for it in materials["study2"]["items"] if it["category_1"] != STUDY2_EXCLUDED_CATEGORY_1] + return { + "self_category": [{"item_index": i, "category_chosen": "category_1"} for i in range(len(items))], + "peer_estimate_pct": [{"item_index": i, "pct_category_1": 55.0} for i in range(len(items))], + } + raise KeyError(study_id) + + +def run_smoke_test(): + materials = load_json(MATERIALS_PATH) + task = load_json(TASK_PATH) + failures = [] + for study in task["studies"]: + study_id = study["study_id"] + for condition_id in study["conditions"]: + try: + prompt = build_prompt(study_id, condition_id, materials) + if not prompt: + failures.append(f"{study_id}/{condition_id}: empty prompt") + continue + resp = synthetic_response(study_id, condition_id, materials) + ok, errors = validate_response(study_id, condition_id, resp, materials) + if not ok: + failures.append(f"{study_id}/{condition_id}: {errors}") + else: + print(f"PASS {study_id}/{condition_id}") + except Exception as e: + failures.append(f"{study_id}/{condition_id}: exception {e!r}") + + if failures: + print("SMOKE TEST FAILURES:", file=sys.stderr) + for f in failures: + print(f" - {f}", file=sys.stderr) + return 1 + print("SMOKE TEST: all study/condition cells passed.") + return 0 + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--study", choices=["study1", "study2", "study3", "study4"]) + parser.add_argument("--condition") + parser.add_argument("--print-prompt", action="store_true", help="print the built prompt as JSON and exit") + parser.add_argument("--response-file", help="path to a JSON file containing the participant's response") + parser.add_argument("--out", help="path to write the final validated record; defaults to stdout") + parser.add_argument("--smoke-test", action="store_true", help="run offline self-test over all study/condition cells") + args = parser.parse_args() + + if args.smoke_test: + sys.exit(run_smoke_test()) + + if not args.study: + parser.error("--study is required unless --smoke-test is given") + + materials = load_json(MATERIALS_PATH) + task = load_json(TASK_PATH) + + study_def = next((s for s in task["studies"] if s["study_id"] == args.study), None) + if study_def is None: + parser.error(f"unknown study {args.study!r}") + + condition_id = args.condition or random.choice(study_def["conditions"]) + if condition_id not in study_def["conditions"]: + parser.error(f"condition {condition_id!r} not valid for {args.study}; choices: {study_def['conditions']}") + + prompt = build_prompt(args.study, condition_id, materials) + + if args.print_prompt: + print(json.dumps({"study_id": args.study, "condition_id": condition_id, "prompt": prompt}, indent=2)) + return + + if not args.response_file: + parser.error("--response-file is required to record a response (or use --print-prompt to only view materials)") + + response = load_json(args.response_file) + ok, errors = validate_response(args.study, condition_id, response, materials) + if not ok: + print(json.dumps({"status": "invalid_response", "errors": errors}, indent=2), file=sys.stderr) + sys.exit(1) + + record = {"study_id": args.study, "condition_id": condition_id, **response} + if args.study == "study4": + record["faithfulness_caveat"] = prompt["faithfulness_caveat"] + if args.study == "study2": + record["faithfulness_caveat"] = prompt["faithfulness_caveat"] + + output = json.dumps(record, indent=2) + if args.out: + Path(args.out).write_text(output, encoding="utf-8") + else: + print(output) + + +if __name__ == "__main__": + main() diff --git a/studies/study_016/task/task.json b/studies/study_016/task/task.json new file mode 100644 index 0000000..81bf145 --- /dev/null +++ b/studies/study_016/task/task.json @@ -0,0 +1,88 @@ +{ + "_purpose": "Defines the runnable agent interaction: what an agent-participant is shown, what it must produce, how condition assignment works, and how outputs map back to materials.json. task/adapter.py implements this contract.", + "task_id": "false_consensus_effect_replication", + "paper_ref": "../source/paper_metadata.json", + "materials_ref": "../materials/materials.json", + "entry_point": "task/adapter.py", + "network_access": "none required or permitted at runtime", + "participant_role": "The agent plays the role of a single human survey/experiment participant. Each invocation of adapter.py administers exactly one (study, condition) cell to one simulated participant and returns one structured response record. To reproduce the paper's group-level statistics, the harness must invoke adapter.py many times per condition (matching or approximating the original per-condition n's in study.json) and pass the collected records to evaluation/evaluation.py.", + "studies": [ + { + "study_id": "study1", + "label": "Hypothetical-story questionnaire (4 stories)", + "design": "between-subjects; one story per participant", + "conditions": ["supermarket", "term_paper", "traffic_ticket", "space_program"], + "target_n_per_condition": 80, + "steps": [ + {"step": "present_story", "materials_path": "study1.conditions[*].story_text"}, + {"step": "elicit_own_choice", "response_field": "own_choice", "options_from": "study1.conditions[*].own_choice_options"}, + {"step": "elicit_consensus_estimate", "materials_path": "study1.conditions[*].consensus_question", "response_field": "consensus_estimate", "format": "two percentages summing to 100, one per own_choice_options entry"}, + {"step": "elicit_trait_ratings", "traits_from": "study1.conditions[*].traits", "response_field": "trait_ratings", "format": "for each trait, two ratings in [-50,50]: one for the typical person choosing option 1, one for option 2, using trait_scale_template"} + ] + }, + { + "study_id": "study2", + "label": "35-item (34 usable) self/peer categorization questionnaire", + "design": "within-subjects; all usable items shown to every participant", + "conditions": ["self_first", "peer_first"], + "target_n_per_condition": 40, + "note": "Order (self-categorize first vs. peer-estimate first) had no reported effect in the original study; both conditions are offered for completeness but adapter.py defaults to self_first.", + "excluded_items": ["Political expectations: Expects removal of Nixon from office"], + "steps": [ + {"step": "self_categorize", "response_field": "self_category", "format": "for each of the 34 usable items, which of category_1/category_2 applies to the participant"}, + {"step": "estimate_peer_percentage", "response_field": "peer_estimate_pct", "format": "for each item, estimated % of 'college students in general' who fall in category_1"} + ] + }, + { + "study_id": "study3", + "label": "Hypothetical sandwich-board-sign story (2 sign versions)", + "design": "between-subjects; one sign version per participant", + "conditions": ["eat_at_joes", "repent"], + "target_n_per_condition": 52, + "steps": [ + {"step": "present_story", "materials_path": "study3.conditions[*].story_text"}, + {"step": "elicit_own_choice", "response_field": "own_choice", "options_from": "study3.conditions[*].own_choice_options"}, + {"step": "elicit_consensus_estimate", "materials_path": "study3.conditions[*].consensus_question", "response_field": "consensus_estimate"}, + {"step": "elicit_trait_ratings", "traits_from": "study3.conditions[*].traits", "response_field": "trait_ratings", "format": "for each of the 8 traits, ratings in [-50,50] for the typical person who would wear vs. not wear the sign"} + ] + }, + { + "study_id": "study4", + "label": "Text-reconstructed real-choice sandwich-board scenario", + "design": "between-subjects; sign-version not specified by the paper for Study 4 (only Study 3 varied the sign text) — adapter.py uses a single generic administration", + "conditions": ["generic"], + "target_n_per_condition": 80, + "readiness": "blocked_partial", + "blocking_reason": "The original Study 4 manipulation depended on a live experimenter, a real 30-minute campus walk, and genuine deception/debriefing — none of which a text-only agent task can faithfully reproduce. This condition administers the same textual materials (cover story + Likes/Dislikes vignettes) and records a stated hypothetical choice; it is NOT a behavioral replication and must be reported as such, never conflated with the original 'real choice' data.", + "steps": [ + {"step": "present_likes_dislikes_intro", "materials_path": "study4.likes_dislikes_intro_task"}, + {"step": "present_cover_story", "materials_path": "study4.cover_story_script"}, + {"step": "elicit_own_choice", "response_field": "own_choice", "options_from": "study4.own_choice_options"}, + {"step": "elicit_consensus_estimate", "materials_path": "study4.consensus_question", "response_field": "consensus_estimate"}, + {"step": "assign_target_version_pairing", "materials_path": "study4.target_person_materials", "note": "randomize which of Version A/B is presented as 'agreed' vs 'refused', per study4.target_person_pairing_note"}, + {"step": "elicit_trait_ratings", "traits_from": "study4.traits.value", "response_field": "trait_ratings", "format": "for each of the 8 assumed traits, ratings in [-50,50] for each of the two target persons", "caveat": "study4.traits.evidence_label is 'missing' — trait list is an assumption carried over from Study 3, not confirmed for Study 4"} + ] + } + ], + "response_schema": { + "type": "object", + "required": ["study_id", "condition_id", "own_choice", "consensus_estimate"], + "properties": { + "study_id": {"type": "string", "enum": ["study1", "study2", "study3", "study4"]}, + "condition_id": {"type": "string"}, + "own_choice": {"type": "string", "description": "for study1/study3/study4: which option the participant personally picked; for study2: N/A at record level (per-item in self_category)"}, + "consensus_estimate": {"type": "object", "description": "for study1/study3/study4: {option: percentage} summing to 100; for study2: per-item peer_estimate_pct list"}, + "trait_ratings": {"type": "object", "description": "trait -> {option_or_target: rating in [-50,50]}, omitted for study2"}, + "self_category": {"type": "array", "description": "study2 only: list of {item_index, category_chosen}"}, + "peer_estimate_pct": {"type": "array", "description": "study2 only: list of {item_index, pct_category_1}"} + } + }, + "condition_assignment": { + "method": "uniform random over the study's listed conditions unless the caller pins a condition via --study/--condition CLI flags", + "rationale": "matches the original studies' between-subjects random assignment to story/sign version" + }, + "outputs": { + "single_run_record": "one JSON object per adapter.py invocation, matching response_schema, written to stdout or --out-file", + "aggregate_input_for_evaluation": "a JSON-lines file of many single_run_records (one participant each), passed to evaluation/evaluation.py" + } +}