File size: 5,838 Bytes
b070298
 
3a15783
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b070298
 
3a15783
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b070298
 
3a15783
b070298
3a15783
 
 
39756f7
3a15783
 
 
b070298
3a15783
 
 
 
 
 
b070298
3a15783
 
 
 
 
 
 
 
 
 
 
 
 
 
b070298
 
3a15783
 
 
 
 
 
aace1e6
 
 
 
 
 
 
 
 
3a15783
 
 
aace1e6
3a15783
 
aace1e6
 
 
b070298
3a15783
39756f7
3a15783
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
import gradio as gr

# Define the 44 BFI questions
questions = [
    "1. Talks a lot",
    "2. Notices other people’s weak points",
    "3. Does things carefully and completely",
    "4. Is sad, depressed",
    "5. Is original, comes up with new ideas",
    "6. Keeps their thoughts to themselves",
    "7. Is helpful and not selfish with others",
    "8. Can be kind of careless",
    "9. Is relaxed, handles stress well",
    "10. Is curious about lots of different things",
    "11. Has a lot of energy",
    "12. Starts arguments with others",
    "13. Is a good, hard worker",
    "14. Can be tense; not always easy going",
    "15. Clever; thinks a lot",
    "16. Makes things exciting",
    "17. Forgives others easily",
    "18. Isn’t very organized",
    "19. Worries a lot",
    "20. Has a good, active imagination",
    "21. Tends to be quiet",
    "22. Usually trusts people",
    "23. Tends to be lazy",
    "24. Doesn’t get upset easily; steady",
    "25. Is creative and inventive",
    "26. Has a good, strong personality",
    "27. Can be cold and distant with others",
    "28. Keeps working until things are done",
    "29. Can be moody",
    "30. Likes artistic and creative experiences",
    "31. Is kind of shy",
    "32. Kind and considerate to almost everyone",
    "33. Does things quickly and carefully",
    "34. Stays calm in difficult situations",
    "35. Likes work that is the same every time",
    "36. Is outgoing; likes to be with people",
    "37. Is sometimes rude to others",
    "38. Makes plans and sticks to them",
    "39. Get nervous easily",
    "40. Likes to think and play with ideas",
    "41. Doesn’t like artistic things (plays, music)",
    "42. Likes to cooperate; goes along with others",
    "43. Has trouble paying attention",
    "44. Knows a lot about art, music and books"
]

# Scoring function based on the provided SPSS syntax
def compute_bfi_scores(*args):
    responses = list(args)
    # Convert 'No response' to None, else to int
    processed = []
    for r in responses:
        if r == "No response":
            processed.append(None)
        else:
            processed.append(int(r))
    
    # Define traits with their respective items and scoring parameters
    traits = {
        'Extraversion': {
            'positive': [1, 11, 16, 26, 36],
            'reverse': [6, 21, 31],
            'threshold': 1,
            'formula_pos_mult': 5,
            'formula_reverse_mult': 3,
            'formula_reverse_const': 12
        },
        'Agreeableness': {
            'positive': [7, 17, 22, 32, 42],
            'reverse': [2, 12, 27, 37],
            'threshold': 1,
            'formula_pos_mult': 5,
            'formula_reverse_mult':4,
            'formula_reverse_const':16
        },
        'Conscientiousness': {
            'positive': [3, 13, 28, 33, 38],
            'reverse': [8, 18, 23, 43],
            'threshold': 1,
            'formula_pos_mult':5,
            'formula_reverse_mult':4,
            'formula_reverse_const':16
        },
        'Neuroticism':{
            'positive':[4, 14, 19, 29, 39],
            'reverse':[9, 24, 34],
            'threshold':1,
            'formula_pos_mult':5,
            'formula_reverse_mult':3,
            'formula_reverse_const':12
        },
        'Openness':{
            'positive':[5, 10, 15, 20, 25, 30, 40, 44],
            'reverse':[35, 41],
            'threshold':2,
            'formula_pos_mult':8,
            'formula_reverse_mult':2,
            'formula_reverse_const':8
        }
    }

    scores = {}

    for trait, info in traits.items():
        pos_items = [processed[i-1] for i in info['positive']]
        rev_items = [processed[i-1] for i in info['reverse']]

        missing_pos = pos_items.count(None)
        missing_rev = rev_items.count(None)
        total_missing = missing_pos + missing_rev

        if total_missing > info['threshold']:
            scores[trait] = "Incomplete"
        else:
            # Compute means, ignoring None
            pos_values = [x for x in pos_items if x is not None]
            rev_values = [x for x in rev_items if x is not None]

            mean_pos = sum(pos_values) / len(pos_values) if pos_values else 0
            mean_rev = sum(rev_values) / len(rev_values) if rev_values else 0

            # Apply the scoring formula
            score = (mean_pos * info['formula_pos_mult']) + (info['formula_reverse_const'] - (mean_rev * info['formula_reverse_mult']))
            score = round(score, 2)
            scores[trait] = score

    # Prepare the output in Markdown format
    output = "## Your Big Five Personality Traits Scores\n\n"
    for trait, score in scores.items():
        output += f"**{trait}**: {score}\n\n"

    return output

# Create the Gradio interface
def create_interface():
    with gr.Blocks() as demo:
        gr.Markdown("## Big Five Inventory (BFI) Quiz")
        gr.Markdown("Please rate the following statements on a scale from **1 (Disagree a lot)** to **5 (Agree a lot)**. If you prefer not to respond to a particular statement, select **'No response'**.")

        # Create a grid layout for better organization
        with gr.Column():
            dropdowns = []
            for q in questions:
                dropdown = gr.Dropdown(
                    choices=["No response", 1, 2, 3, 4, 5],
                    label=q,
                    value="No response"
                )
                dropdowns.append(dropdown)
        
        # Submit button
        submit_btn = gr.Button("Submit")
        
        # Results display
        result = gr.Markdown()
        
        # Link the button to the function
        submit_btn.click(fn=compute_bfi_scores, inputs=dropdowns, outputs=result)

    return demo

# Launch the interface
demo = create_interface()
demo.launch()