Exemplo n.º 1
0
def mediation(df, x, m, y):
    p = Process(data=df, model=4, x=x, y=y, m=[m], suppr_init=True)

    y_score = p.outcome_models[y].coeff_summary()[['coeff', 'p']].round(3)
    m_score = p.outcome_models[m].coeff_summary()[['coeff', 'p']].round(3)

    y_score = y_score.to_dict('index')
    m_score = m_score.to_dict('index')

    scores = dict()
    scores['x-m'] = m_score[x]
    scores['m-y'] = y_score[m]
    scores["x-y"] = y_score[x]

    G = nx.Graph()
    G.add_node(x, pos=(10, 10), name=x)
    G.add_node(m, pos=(20, 13), name=y)
    G.add_node(y, pos=(30, 10), name=m)

    G.add_edge(
        x,
        y,
        weight=4,
    )
    G.add_edge(x, m, weight=2)
    G.add_edge(m, y, weight=2)
    pos = nx.get_node_attributes(G, 'pos')

    plt.figure(figsize=(18, 8))
    plt.margins(x=0.2, y=0.2)
    labels = {node: node for node in G.nodes()}
    nx.draw(G,
            pos,
            edge_color='lightgrey',
            width=1,
            linewidths=1,
            node_size=1300,
            node_color='pink',
            labels=labels,
            node_shape='s',
            font_size=21)
    nx.draw_networkx_edge_labels(G,
                                 pos,
                                 edge_labels={
                                     (x, y): scores['x-y'],
                                     (x, m): scores['x-m'],
                                     (m, y): scores['m-y']
                                 },
                                 font_color='red',
                                 font_size=21)

    plt.axis('off')
    return plt
Exemplo n.º 2
0
def get_ols_accuracy(model_num):
    with open("Results/Results_OLS_Model{}.txt".format(model_num)) as f:
        spssoutput = f.read().split(
            "******************** DIRECT AND INDIRECT EFFECTS *************************\n"
        )[1]

    data = pd.read_csv("Data/Data_Model{}.csv".format(model_num))
    varlist = open(
        "Data/Varlist_Model{}.txt".format(model_num)).read().split(",")

    kwargs = {i: i for i in varlist if "m" not in i}
    if ("m1" in varlist) & (model_num > 3):
        kwargs["m"] = ["m1", "m2"]
    else:
        kwargs["m"] = "m"

    process = Process(data,
                      model_num,
                      precision=4,
                      conf=95,
                      modval={},
                      quantile=0,
                      logit=0,
                      seed=123456,
                      suppr_init=True,
                      total=1,
                      **kwargs)

    dir = process.direct_model
    indir = process.indirect_model

    if dir.has_moderation:
        truedir = get_direct_effect_mod(spssoutput)
    else:
        truedir = get_direct_effect(spssoutput)
    estdir = dir.coeff_summary()

    if indir.has_moderation:
        trueindir = get_indirect_effect_mod(spssoutput)
    else:
        trueindir = get_indirect_effect(spssoutput)
    estindir = indir.coeff_summary()

    # Sort datasets
    coldir = ["Effect", "SE", "t", "p", "LLCI", "ULCI"]
    colindir = ["Effect", "Boot SE", "BootLLCI", "BootULCI"]
    sortcols_dir = [i for i in truedir.columns if i not in coldir + [""]]
    sortcols_indir = [i for i in trueindir.columns if i not in colindir]
    if sortcols_dir:
        estdir = estdir.sort_values(by=sortcols_dir)
    if sortcols_indir:
        estindir = estindir.sort_values(by=sortcols_indir)

    direffects = np.isclose(truedir[coldir].values,
                            estdir[coldir].values,
                            rtol=1e-3,
                            atol=1e-3).mean()
    indireffects = np.isclose(trueindir["Effect"].values,
                              estindir["Effect"].values,
                              rtol=1e-3,
                              atol=1e-3).mean()
    indirboots = np.isclose(trueindir[colindir].values,
                            estindir[colindir].values,
                            rtol=1e-2,
                            atol=1e-2).mean()
    return direffects, indireffects, indirboots
Exemplo n.º 3
0
from pyprocessmacro import Process
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt


df = pd.read_csv("./TestCases/Data_Model12.csv")
varlist = open("./Tests/Data/Varlist_Model12.txt").read().split(",")
kwargs = {i: i for i in varlist if "m" not in i}
df["ZOO"] = df["z"]
df["KA"] = df["w"]
kwargs["m"] = ["m1", "m2"]
kwargs["z"] = "ZOO"
kwargs["w"] = "KA"
p = Process(data=df, model=12, **kwargs, seed=14568743, hc3=True)
jn_regions = p.compute_jn_region("direct", "KA")
print(p.spotlight_direct_effect({"KA": [*jn_regions[0], *jn_regions[1]],
                                            "ZOO":[0]}))
jn_regions = p.compute_jn_region("indirect", "KA", med_name="m1")
print(p.spotlight_indirect_effect("m1", {"KA": [*jn_regions[0], *jn_regions[1]],
                                            "ZOO":[0]}))

g = p.plot_conditional_direct_effects(x="KA", modval={"KA":np.linspace(-2, 2)})

for r in jn_regions:
    for v in r:
        g.ax.axvline(v)
g.ax.set_xlim(-1, 1)
plt.show()