Python 实现对数似然比对比曲线及其代码问题分析

Python 实现对数似然比对比曲线及其代码问题分析

主要解决问题:
画出空间统计一个圆柱扫描内部期望为10个病例,全局总数分别为 50、200 和 2000 时,窗口内实际发生例数从 1 到 30 变化时相应的对数似然比曲线。
预期结果:
这里写图片描述

(1)公式分析:
下面公式为为对数广义似然比(LGLR):
这里写图片描述
其中, C 是全部空间时间上的病例总数

C = z = 1 Z d = 1 D C z d
,
C A 是圆柱区内空间时间上的病例总数 C A = z , d A C z d $  \upmu_A $ 是圆柱区内空间时间上的病例总数期望值 这里写图片描述。当计算结果GLR_A的值越大,说明在圆柱区 A 内病例的聚集程度就越高。因此,可以用GLR_A来作为空间和时间区域内的预警信号指标。广义似然比标志了区域A 上实际发生事件数C_A与期望发生事件数 A m 之间的差异度,并以全局上在区域 A 之外的事件数比值 ( ) ( ) / AA C C Cm --作为参照。
(2) 针对问题代码实现:

import numpy as np
import matplotlib.pyplot as plt
import math

mu_A = 10   #窗口内期望病例数
C_sum = [50,200,2000]  #全局总数
#C_sum = 200 #全局总数
print(C_sum[2])
C_A_sum = np.arange(1,31,1)  #窗口内实际发生病例从 1 到 30 变化
C_A_sumArr = []  #定义横坐标变量数组
LGLR_AArr =  []    #定义纵坐标变量数组1,c=50
LGLR_AArr1 = []   #定义纵坐标变量数组2,c=200
LGLR_AArr2 = []   #定义纵坐标变量数组3,c=2000

for x in C_A_sum:
    C_A_sumArr.append(x)
    LGLR_AArr.append(x * math.log(x/mu_A)+(C_sum[0]-x) * math.log((C_sum[0]-x)/(C_sum[0]-mu_A)))

for x in C_A_sum:
    C_A_sumArr.append(x)
    LGLR_AArr1.append(x * math.log(x/mu_A)+(C_sum[1]-x) * math.log((C_sum[1]-x)/(C_sum[1]-mu_A)))

for x in C_A_sum:
    C_A_sumArr.append(x)
    LGLR_AArr2.append(x * math.log(x/mu_A)+(C_sum[2]-x) * math.log((C_sum[2]-x)/(C_sum[2]-mu_A)))

#print(LGLR_AArr)
# 输出
plt.plot(C_A_sum, LGLR_AArr, color='green', label='c=50')
plt.plot(C_A_sum, LGLR_AArr1,  color='red', label='c=200')
plt.plot(C_A_sum, LGLR_AArr2,  color='skyblue', label='c=2000')

plt.xlim([0, 30])    #横轴   
plt.ylim([0, 20])    #纵轴

#标题
plt.title('likelihood value')  
plt.xlabel('C_A')
plt.ylabel('LGLR')
plt.legend(loc='best')

plt.show()  #显示图

则可得到预期效果。

(3)调试过程问题:
1、当用到math.log()函数值,总是出现如下错误:
原因:math.log()不能对矩阵进行直接操作。
TypeError: only length-1 arrays can be converted to Python scalars 分析

2、当用到math包时,有如下错误提醒:
ValueError: math domain error
原因:某些操作不符合数学定义,如对负数取对数,对负数开平方。
分析

猜你喜欢

转载自blog.csdn.net/qq_34734303/article/details/80620925