Beispiel #1
0
def motivation_test():
    cause = []
    for i in range(0, 5):
        cause.extend(up(0.0, 1.0, 10))
        cause.extend(const(1.0, 20))
        cause.extend(down(0.0, 1.0, 10))
        cause.extend(const(0.0, 20))
    noise1 = np.random.normal(0, 0.1, len(cause))
    noise2 = np.random.normal(0, 0.1, len(cause))
    effect = forward_shift_continue_data(cause, 8)
    for i in range(0, len(cause)):
        cause[i] += noise1[i]
        effect[i] += noise2[i]
    plt.plot(cause)
    plt.plot(effect)
    plt.show()
    print cause
    print effect
    #cause2effect = calculate_difference3(cause, effect, 6)
    #effect2cause = calculate_difference3(effect, cause, 6)
    cause = change_to_zero_one(cause)
    effect = change_to_zero_one(effect)
    cause2effect = bernoulli(effect) - cbernoulli(effect, cause)
    effect2cause = bernoulli(cause) - cbernoulli(cause, effect)
    print 'cause' + ' -> ' + 'effect' + ':' + str(cause2effect)
    print 'effect' + ' -> ' + 'cause' + ':' + str(effect2cause)
    p = math.pow(2, -(cause2effect - effect2cause))
    print p
def test_sin3(c, e):
    cause = c
    effect = e
    cause = change_to_zero_one(cause)
    effect = change_to_zero_one(effect)
    cause2effect = bernoulli(effect) - cbernoulli(effect, cause)
    effect2cause = bernoulli(cause) - cbernoulli(cause, effect)
    print 'cause' + ' -> ' + 'effect' + ':' + str(cause2effect)
    print 'effect' + ' -> ' + 'cause' + ':' + str(effect2cause)
    p = math.pow(2, -(cause2effect - effect2cause))
    print p
def test_sin():
    input, output1, output2, output3 = read_sin_data()

    #noise1 = np.random.normal(0, 0.1, 100)
    #noise2 = np.random.normal(0, 0.1, 100)
    #cause = input[0:113]
    #cause.extend(noise1)
    #cause.extend(input[113:-1])
    #effect = output2[0:113]
    #effect.extend(noise2)
    #effect.extend(output2[113:-1])

    #for i in range(0,len(effect)):
    #effect[i] = effect[i]+np.random.normal(0, 0.3, 1)[0]

    cause = input
    effect = output1
    noise = np.random.normal(0, 0.5, len(effect))
    noise2 = np.random.normal(0, 0.5, len(effect))
    for i in range(0, len(effect)):
        cause[i] = cause[i] + noise[i]
        effect[i] = effect[i] + noise2[i]
    print cause
    print effect
    plt.plot(cause)
    plt.plot(effect)
    plt.show()
    #cause = normalize(cause)
    #cause = zero_change(cause)
    #effect = normalize(effect)
    #effect = zero_change(effect)
    #cause2effect = calculate_difference3(cause, effect, 100)
    #effect2cause = calculate_difference3(effect, cause, 100)

    cause = change_to_zero_one(cause)
    effect = change_to_zero_one(effect)
    cause2effect = bernoulli(effect) - cbernoulli(effect, cause)
    effect2cause = bernoulli(cause) - cbernoulli(cause, effect)

    print 'cause' + ' -> ' + 'effect' + ':' + str(cause2effect)
    print 'effect' + ' -> ' + 'cause' + ':' + str(effect2cause)
    p = math.pow(2, -(cause2effect - effect2cause))
    print p
def river_test2():
    length = 6
    date_time, fremersdorf, hanweiler, sanktarnual = collect_data2()
    fremersdorf = map(float, fremersdorf)
    hanweiler = map(float, hanweiler)
    sanktarnual = map(float, sanktarnual)
    fremersdorf = zero_change(fremersdorf)
    hanweiler = zero_change(hanweiler)
    sanktarnual = zero_change(sanktarnual)

    cause = change_to_zero_one(fremersdorf)
    effect = change_to_zero_one(hanweiler)
    delta_fr_to_hw = bernoulli2(effect, length) - cbernoulli2(
        effect, cause, length)
    delta_hw_to_fr = bernoulli2(cause, length) - cbernoulli2(
        cause, effect, length)

    #delta_fr_to_hw = calculate_difference3(fremersdorf,hanweiler,10)
    #delta_hw_to_fr = calculate_difference3(hanweiler,fremersdorf,10)
    print "fr->hw =", delta_fr_to_hw, " hw->fr =", delta_hw_to_fr

    cause = change_to_zero_one(sanktarnual)
    effect = change_to_zero_one(hanweiler)
    delta_sa_to_hw = bernoulli2(effect, length) - cbernoulli2(
        effect, cause, length)
    delta_hw_to_sa = bernoulli2(cause, length) - cbernoulli2(
        cause, effect, length)

    #delta_sa_to_hw =calculate_difference3(sanktarnual,hanweiler,10)
    #delta_hw_to_sa = calculate_difference3(hanweiler,sanktarnual,10)
    print "sa->hw =", delta_sa_to_hw, " hw->sa =", delta_hw_to_sa

    cause = change_to_zero_one(fremersdorf)
    effect = change_to_zero_one(sanktarnual)
    delta_fr_to_sa = bernoulli2(effect, length) - cbernoulli2(
        effect, cause, length)
    delta_sa_to_fr = bernoulli2(cause, length) - cbernoulli2(
        cause, effect, length)

    #delta_fr_to_sa = calculate_difference3(fremersdorf,sanktarnual,10)
    #delta_sa_to_fr = calculate_difference3(sanktarnual,fremersdorf,10)
    print "fr->sa =", delta_fr_to_sa, " sa->fr =", delta_sa_to_fr
Beispiel #5
0
def test_data(length, array_length):
    #txtName = "causal_continue_noise_0.4_normal_sample_1000_length_200.txt"
    #f = file(txtName, "a+")
    counter11 = 0
    counter10 = 0
    counter01 = 0
    counter00 = 0
    counter11_01 = 0
    counter10_01 = 0
    counter01_01 = 0
    counter00_01 = 0
    counter_undecided = 0
    counter_true = 0
    counter_false = 0
    counter_undecided2 = 0
    counter_true2 = 0
    counter_false2 = 0
    counter_error_1 = 0
    counter_error_2 = 0
    p_array_granger1 = []
    p_array_granger2 = []
    p_array_CUTE1 = []
    p_array_CUTE2 = []
    p_array_improve_CUTE1 = []
    p_array_improve_CUTE2 = []
    p_array1 = []
    p_array2 = []
    p_array_granger = []
    for i in range(0, 1000):
        write_str = ""
        p = random.randint(1, 3)
        #effect, test1 = generate_continue_data(200, p)

        #cause, effect = generate_continue_data(150, p)
        #cause_tmp = list(cause)
        #effect_tmp = list(effect)
        #cause = zero_change(cause)
        #effect = zero_change(effect)

        #cause,effect = generate_continue_data_with_change_lag(350,10)
        cause = GMM(3, array_length)
        effect = GMM(5, array_length)

        cause_tmp = list(cause)
        effect_tmp = list(effect)

        #effect = forward_shift_continue_data(cause,p)
        #noise = np.random.normal(0, 0.1, 200)
        #for j in range(0, 200):
        #    effect[j] = effect[j] + noise[j]

        #for i in range(0,len(cause)):
        #cause[i]=math.tanh(cause[i])
        #cause[i] = math.pow(math.e,cause[i])
        #effect[i] = math.pow(math.e,effect[i])
        #cause[i] = math.pow(cause[i],3)/10
        #effect[i] = math.pow(effect[i],3)/10
        #effect[i]=math.tanh(effect[i])
        #effect[i] = math.pow(effect[i],3)
        #effect = GMM(8,200)

        #plt.plot(cause)
        #plt.plot(effect)
        #plt.show()
        #cause = normalize(cause)
        #effect = normalize(effect)

        #cause = normalize_data(cause)
        #effect = normalize_data(effect)

        #cause = zero_change(cause)
        #effect = zero_change(effect)
        from scipy.special import expit
        #for i in range(0,len(effect)):
        #effect[i]=expit(effect[i])
        #effect[i] = 1.0/effect[i]

        for ii in range(0, len(cause)):
            write_str = write_str + " " + str(cause[ii])
        for jj in range(0, len(effect)):
            write_str = write_str + " " + str(effect[jj])
        #print "cause:" + str(cause)
        #print "effect:" + str(effect)
        # effect, test2 = ge_normal_data(p,200)

        print "Continuous data, Granger causality test"
        print "cause->effect"
        p_value_cause_to_effect1 = []
        flag1 = False
        #ce1 = grangercausalitytests([[effect[i], cause[i]] for i in range(0, len(cause))], p)
        ce_p = granger(cause, effect, -1)
        #for key in ce1:
        #    p_value_cause_to_effect1.append(ce1[key][0]["params_ftest"][1])
        #   if ce1[key][0]["params_ftest"][1] < 0.05:
        #        flag1 = True
        if ce_p < 0.05:
            flag1 = True
        print "effect->cause"
        p_value_effect_to_cause2 = []
        flag2 = False
        #ce2 = grangercausalitytests([[cause[i], effect[i]] for i in range(0, len(cause))], p)
        ce2_p = granger(effect, cause, -1)
        #for key in ce2:
        #    p_value_effect_to_cause2.append(ce2[key][0]["params_ftest"][1])
        #    if ce2[key][0]["params_ftest"][1] < 0.05:
        #        flag2 = True
        if ce2_p < 0.05:
            flag2 = True
        if ce_p < 0.05:
            p_array_granger1.append(ce_p)
        elif ce2_p < 0.05:
            p_array_granger2.append(ce2_p)
        if flag1 and flag2:
            print "Continuous data,Granger two-way cause and effect"
            write_str = write_str + " " + "连续数据,格兰杰双向因果"
            counter11 += 1
        elif flag1 and not flag2:
            print "Continuous data,Granger correct cause and effect"
            write_str = write_str + " " + "连续数据,格兰杰正确因果"
            counter10 += 1
            p_array_granger.append(ce_p)
        elif not flag1 and flag2:
            print "Continuous data,Granger wrong cause and effect"
            write_str = write_str + " " + "连续数据,格兰杰错误因果"
            counter01 += 1
        elif not flag1 and not flag2:
            print "Continuous data,Granger no cause and effect"
            write_str = write_str + " " + "连续数据,格兰杰没有因果"
            #break
            counter00 += 1
        #write_str = write_str + " " + str(min(p_value_cause_to_effect1)) + " " + str(min(p_value_effect_to_cause2))
        cause2 = get_type_array(cause, length)
        effect2 = get_type_array(effect, length)
        print "01 data, Granger causality test"
        print "cause->effect"
        p_value_cause_to_effect3 = []
        flag3 = False
        #ce3 = grangercausalitytests([[effect2[i], cause2[i]] for i in range(0, len(cause2))], p)
        ce3_p = granger(cause2, effect2, -1)
        #for key in ce3:
        #    p_value_cause_to_effect3.append(ce3[key][0]["params_ftest"][1])
        #    if ce3[key][0]["params_ftest"][1] < 0.05:
        #        flag3 = True
        if ce3_p < 0.05:
            flag3 = True
        print "effect->cause"
        p_value_effect_to_cause4 = []
        flag4 = False
        #ce4 = grangercausalitytests([[cause2[i], effect2[i]] for i in range(0, len(cause2))], p)
        ce4_p = granger(effect2, cause2, -1)
        #for key in ce4:
        #    p_value_effect_to_cause4.append(ce4[key][0]["params_ftest"][1])
        #    if ce4[key][0]["params_ftest"][1] < 0.05:
        #        flag4 = True
        if ce4_p < 0.05:
            flag4 = True
        if flag3 and flag4:
            print "01 data,Granger two-way cause and effect"
            write_str = write_str + " " + "离散数据,格兰杰双向因果"
            counter11_01 += 1
        elif flag3 and not flag4:
            print "01 data,Granger correct cause and effect"
            write_str = write_str + " " + "离散数据,格兰杰正确因果"
            counter10_01 += 1
        elif not flag3 and flag4:
            print "01 data,Granger wrong cause and effect"
            write_str = write_str + " " + "离散数据,格兰杰错误因果"
            counter01_01 += 1
        elif not flag3 and not flag4:
            print "01 data,Granger no cause and effect"
            write_str = write_str + " " + "离散数据,格兰杰没有因果"
            counter00_01 += 1
        #write_str = write_str + " " + str(min(p_value_cause_to_effect3)) + " " + str(min(p_value_effect_to_cause4))
        print

        delta_ce = calculate_difference3(cause, effect, length)
        delta_ec = calculate_difference3(effect, cause, length)
        print 'cause' + ' -> ' + 'effect' + ':' + str(delta_ce)
        print 'effect' + ' -> ' + 'cause' + ':' + str(delta_ec)
        if delta_ce > delta_ec and delta_ce - delta_ec >= -math.log(0.05, 2):
            print "CUTE,correct cause and effect"
            write_str = write_str + " " + "CUTE,正确因果"
            counter_true += 1
        elif delta_ec > delta_ce and delta_ec - delta_ce >= -math.log(0.05, 2):
            print "CUTE,wrong cause and effect"
            write_str = write_str + " " + "CUTE,错误因果"
            counter_false += 1
        else:
            print "CUTE,undecided"
            write_str = write_str + " " + "CUTE,未决定"
            counter_undecided += 1

        write_str = write_str + " " + str(pow(2, -abs(delta_ce - delta_ec)))
        p = math.pow(2, -(delta_ce - delta_ec))
        if p < 1:
            p_array1.append(p)
        else:
            p_array2.append(math.pow(2, -(delta_ec - delta_ce)))
        #f.write(write_str)
        #f.write("\n")
        cause = change_to_zero_one(cause_tmp)
        effect = change_to_zero_one(effect_tmp)
        cause2effect = bernoulli2(effect, length) - cbernoulli2(
            effect, cause, length)
        effect2cause = bernoulli2(cause, length) - cbernoulli2(
            cause, effect, length)
        # print 'cause' + ' -> ' + 'effect' + ':' + str(cause2effect)
        # print 'effect' + ' -> ' + 'cause' + ':' + str(effect2cause)
        p = math.pow(2, -(cause2effect - effect2cause))
        if p < 1:
            p_array_improve_CUTE1.append(p)
        else:
            p_array_improve_CUTE2.append(
                math.pow(2, -(effect2cause - cause2effect)))

        cause2effect = bernoulli(effect) - cbernoulli(effect, cause)
        effect2cause = bernoulli(cause) - cbernoulli(cause, effect)
        if p < 1:
            p_array_CUTE1.append(p)
        else:
            p_array_CUTE2.append(math.pow(2, -(effect2cause - cause2effect)))

        print
        print "*****************************cut line*****************************"
        print
    #f.close()
    print "连续数据,格兰杰因果关系检验:"
    print "双向因果:" + str(counter11)
    print "正确因果:" + str(counter10)
    print "错误因果:" + str(counter01)
    print "没有因果" + str(counter00)
    print "-----------------"
    print "离散数据,格兰杰因果关系检验:"
    print "双向因果:" + str(counter11_01)
    print "正确因果:" + str(counter10_01)
    print "错误因果:" + str(counter01_01)
    print "没有因果" + str(counter00_01)
    print "-----------------"
    print "discret  data,snml causality test:"
    print "correct cause and effect:" + str(counter_true)
    print "wrong cause and effect:" + str(counter_false)
    print "no cause and effect:" + str(counter_undecided)
    print "-----------------"
    print "01 data,CUTE causality test:"
    granger_test = (bh_procedure(p_array_granger1, 0.05) +
                    bh_procedure(p_array_granger2, 0.05)) / 1000.0
    ourmodel = (bh_procedure(p_array1, 0.05) +
                bh_procedure(p_array2, 0.05)) / 1000.0
    cute = (bh_procedure(p_array_CUTE1, 0.05) +
            bh_procedure(p_array_CUTE2, 0.05)) / 1000.0
    improve_cute = (bh_procedure(p_array_improve_CUTE1, 0.05) +
                    bh_procedure(p_array_improve_CUTE2, 0.05)) / 1000.0
    print granger_test
    print improve_cute
    print ourmodel
    return granger_test, ourmodel, cute, improve_cute
def river_test():
    length = 6
    date_time, speyer, mannheim, worms, mainz = collect_data()
    counter = 0
    speyer_low = []
    mannheim_low = []
    worms_low = []
    mainz_low = []
    while counter < 2880:
        speyer_low.append(speyer[counter])
        mannheim_low.append(mannheim[counter])
        worms_low.append(worms[counter])
        mainz_low.append(mainz[counter])
        counter += 1
    speyer = map(float, speyer_low)
    mannheim = map(float, mannheim_low)
    worms = map(float, worms_low)
    mainz = map(float, mainz_low)
    cause = speyer
    effect = mannheim
    cause = zero_change(cause)
    effect = zero_change(effect)

    cause = change_to_zero_one(cause)
    effect = change_to_zero_one(effect)
    sp2ma = bernoulli2(effect, length) - cbernoulli2(effect, cause, length)
    ma2sp = bernoulli2(cause, length) - cbernoulli2(cause, effect, length)
    #sp2ma = calculate_difference3(cause, effect, 10)
    #ma2sp = calculate_difference3(effect, cause, 10)
    print 'sp' + ' -> ' + 'ma' + ':' + str(sp2ma)
    print 'ma' + ' -> ' + 'sp' + ':' + str(ma2sp)
    print
    cause = speyer
    effect = worms
    cause = zero_change(cause)
    effect = zero_change(effect)
    cause = change_to_zero_one(cause)
    effect = change_to_zero_one(effect)
    sp2wo = bernoulli2(effect, length) - cbernoulli2(effect, cause, length)
    wo2sp = bernoulli2(cause, length) - cbernoulli2(cause, effect, length)

    #sp2wo = calculate_difference3(cause, effect, 10)
    #wo2sp = calculate_difference3(effect, cause, 10)
    print 'sp' + ' -> ' + 'wo' + ':' + str(sp2wo)
    print 'wo' + ' -> ' + 'sp' + ':' + str(wo2sp)
    print
    cause = speyer
    effect = mainz
    cause = zero_change(cause)
    effect = zero_change(effect)

    cause = change_to_zero_one(cause)
    effect = change_to_zero_one(effect)
    sp2mz = bernoulli2(effect, length) - cbernoulli2(effect, cause, length)
    mz2sp = bernoulli2(cause, length) - cbernoulli2(cause, effect, length)
    #sp2mz = calculate_difference3(cause, effect, 10)
    #mz2sp = calculate_difference3(effect, cause, 10)
    print 'sp' + ' -> ' + 'mz' + ':' + str(sp2mz)
    print 'mz' + ' -> ' + 'sp' + ':' + str(mz2sp)
    print
    cause = mannheim
    effect = worms
    cause = zero_change(cause)
    effect = zero_change(effect)

    cause = change_to_zero_one(cause)
    effect = change_to_zero_one(effect)
    ma2wo = bernoulli2(effect, length) - cbernoulli2(effect, cause, length)
    wo2ma = bernoulli2(cause, length) - cbernoulli2(cause, effect, length)

    #ma2wo = calculate_difference3(cause, effect, 10)
    #wo2ma = calculate_difference3(effect, cause, 10)
    print 'ma' + ' -> ' + 'wo' + ':' + str(ma2wo)
    print 'wo' + ' -> ' + 'ma' + ':' + str(wo2ma)
    print
    cause = mannheim
    effect = mainz
    cause = zero_change(cause)
    effect = zero_change(effect)

    cause = change_to_zero_one(cause)
    effect = change_to_zero_one(effect)
    ma2mz = bernoulli2(effect, length) - cbernoulli2(effect, cause, length)
    mz2ma = bernoulli2(cause, length) - cbernoulli2(cause, effect, length)

    #ma2mz= calculate_difference3(cause, effect, 10)
    #mz2ma = calculate_difference3(effect, cause, 10)
    print 'ma' + ' -> ' + 'mz' + ':' + str(ma2mz)
    print 'mz' + ' -> ' + 'ma' + ':' + str(mz2ma)
    print
    cause = worms
    effect = mainz
    cause = zero_change(cause)
    effect = zero_change(effect)

    cause = change_to_zero_one(cause)
    effect = change_to_zero_one(effect)
    wo2mz = bernoulli2(effect, length) - cbernoulli2(effect, cause, length)
    mz2wo = bernoulli2(cause, length) - cbernoulli2(cause, effect, length)

    #wo2mz = calculate_difference3(cause, effect, 10)
    #mz2wo = calculate_difference3(effect, cause, 10)
    print 'wo' + ' -> ' + 'mz' + ':' + str(wo2mz)
    print 'mz' + ' -> ' + 'wo' + ':' + str(mz2wo)
    print