def test_sin(): x = np.arange(0, 5 * 2 * np.pi, 0.1) cause = np.sin(x) effect = forward_shift_continue_data(cause, 10) p1 = granger(cause, effect, 10) p2 = granger(cause, effect, 10) print list(cause) print effect plt.plot(cause) plt.plot(effect) plt.show() print p1, p2
def test_granger_h(): counter = 0 for i in range(1, 2): #time, control, valve_position, system_pressure, a_pressure, b_pressure, t_pressure, flow, valve_pressure, load = read_hydraulic_pressure( # 'Sheet' + str(i)) #cause = b_pressure #effect = valve_pressure cause, effect = read_long_data(200) p1 = granger(cause, effect, -1) p2 = granger(effect, cause, -1) print p1 print p2 if p1 < 0.05 and p2 > 0.05: counter += 1
def granger_disadvantage_test(): main = np.random.normal(0, 1, 100) noise = np.random.normal(0, 0.1, 100) main_max = max(main) main_max_index = 0 main_min = min(main) main_min_index = 0 for i in range(0, 100): if main[i] == main_max: main_max_index = i if main[i] == main_min: main_min_index = i noise[main_max_index + 3] = main_max noise[main_min_index + 3] = main_min print list(main) print list(noise) p1 = granger(main, noise, 3) p2 = granger(main, noise, 3) print p1 print p2
def ozone_granger_test(): #x, y = read_ozone() date_time, fremersdorf, hanweiler, sanktarnual = collect_data2() #date_time, speyer, mannheim, worms, mainz = collect_data() #speyer = map(float, speyer) #mannheim = map(float, mannheim) #worms = map(float, worms) #mainz = map(float, mainz) fremersdorf = map(float, fremersdorf) hanweiler = map(float, hanweiler) sanktarnual = map(float, sanktarnual) cause = hanweiler effect = sanktarnual #ce1 = grangercausalitytests([[effect[i], cause[i]] for i in range(0, len(cause))], 5) #ce2 = grangercausalitytests([[cause[i], effect[i]] for i in range(0, len(cause))], 5) p1 = granger(cause, effect, -1) p2 = granger(effect, cause, -1) print p1 print p2
def test_sin_granger(): input, output1, output2, output3 = read_sin_data() 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) cause_tmp = list(cause) effect_tmp = list(effect) plt.plot(cause) plt.plot(effect) plt.show() p1 = granger(cause, effect, -1) p2 = granger(effect, cause, -1) print 'cause->effect' + str(p1) print 'effect->cause' + str(p2) test_sin2(cause_tmp, effect_tmp) test_sin3(cause_tmp, effect_tmp)
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