最近在研究GWPR,参考了很多广义线性模型,特别是泊松回归的相关内容,知识琐碎且繁杂,做个笔记。

泊松回归

定义

泊松回归(Poisson regression)是用来为计数资料和列联表建模的一种回归分析.泊松回归假设反应变量Y是泊松分布,并假设它期望值的对数可被未知参数的线性组合建模.泊松回归模型有时(特别是当用作列联表模型时)又被称作对数-线性模型.需要注意的是,对数线性模型和泊松回归模型并不完全相同,通常对数线性回归的响应变量是连续的,而泊松回归则是离散的.再给出泊松回归模型的形式之前,我们先考虑几个概念:

  • e的概念
    泊松回归代码python 泊松回归适用条件_泊松回归代码python
  • 二项式分布
    泊松回归代码python 泊松回归适用条件_泊松回归代码python_02
    如果我们令泊松回归代码python 泊松回归适用条件_线性代数_03,当泊松回归代码python 泊松回归适用条件_概率论_04泊松回归代码python 泊松回归适用条件_概率论_05的极限是:
    泊松回归代码python 泊松回归适用条件_线性代数_06
    这也说明当泊松回归代码python 泊松回归适用条件_概率论_04时,二项式分布可以近似至泊松分布
  • 泊松分布与泊松回归
    泊松回归代码python 泊松回归适用条件_建模_08
    其中有泊松回归代码python 泊松回归适用条件_线性代数_09,为导出泊松回归的形式,我们记上式为泊松回归代码python 泊松回归适用条件_矩阵_10,则有:
    泊松回归代码python 泊松回归适用条件_建模_11
    做对数变换:
    泊松回归代码python 泊松回归适用条件_泊松回归代码python_12
    再做指数变换:
    泊松回归代码python 泊松回归适用条件_概率论_13
    其中泊松回归代码python 泊松回归适用条件_泊松回归代码python_14称为链接函数,由此得到了泊松回归模型的形式.那么为什么说泊松回归模型是一种广义线性模型(GLM)呢?首先考虑线性回归模型:
    泊松回归代码python 泊松回归适用条件_建模_15
    在广义线性模型中,我们不再要求泊松回归代码python 泊松回归适用条件_建模_16服从泊松回归代码python 泊松回归适用条件_建模_17而是服从于指数分布族,例如Normal;Poisson;Gamma;Binomial.现证明泊松回归属于指数分布族,首先考虑指数分布族的定义:
    泊松回归代码python 泊松回归适用条件_概率论_18
    现在我们回顾一下泊松回归模型的形式:
    泊松回归代码python 泊松回归适用条件_泊松回归代码python_19
    泊松回归代码python 泊松回归适用条件_泊松回归代码python_20,则有:
    泊松回归代码python 泊松回归适用条件_线性代数_21
    所以泊松回归模型也属于指数分布族

参数估计

  • 似然函数
    再给出了模型的形式以后,进一步需要对参数进行估计,采用极大似然估计法,从总体泊松回归代码python 泊松回归适用条件_线性代数_22中抽取容量为泊松回归代码python 泊松回归适用条件_泊松回归代码python_23的随机样本,此时有似然函数:
    泊松回归代码python 泊松回归适用条件_矩阵_24
    对数似然:
    泊松回归代码python 泊松回归适用条件_矩阵_25
    泊松回归代码python 泊松回归适用条件_泊松回归代码python_26求偏导:
    泊松回归代码python 泊松回归适用条件_泊松回归代码python_27
    上式方程组一般情况下并没有解析解,但我们可以通过牛顿拉夫逊迭代法求解:
    泊松回归代码python 泊松回归适用条件_建模_28
    其中泊松回归代码python 泊松回归适用条件_线性代数_29.则泊松回归代码python 泊松回归适用条件_概率论_30关于泊松回归代码python 泊松回归适用条件_线性代数_31的雅克比矩阵:
    泊松回归代码python 泊松回归适用条件_线性代数_32
    此时有Newton-Raphson算法:
    泊松回归代码python 泊松回归适用条件_概率论_33
    在这个迭代过程中,需要给定泊松回归代码python 泊松回归适用条件_线性代数_31的初值和精度泊松回归代码python 泊松回归适用条件_线性代数_35,不断计算上述过程直至泊松回归代码python 泊松回归适用条件_建模_36收敛后结束.
    同时附上MATLAB代码
function F = PoissionRegressopt(b,Y,X)
n = length(Y);
F = 0;
for k = 1:n
    F = F + Y(k)*X(k,:)*b - exp(X(k,:)*b);% - factorial(Y(k));
end
F = - F;


function F = PoissionF(b,Y,X)
n = length(Y);
F = zeros(size(b));
for k = 1:n
    F = F + Y(k)*X(k,:)'- exp(X(k,:)*b)*X(k,:)';
end


function JM  = PoissionJM(b,Y,X)
n = length(Y);
JM  = zeros(size(b,1));
for k = 1:n
    JM = JM +  exp(X(k,:)*b)*X(k,:)'*X(k,:);
end

function [ bm fv1,fv2] = PoissionNR(bm0,Y,X)
itermax = 30;         
errstol = 1e-4;        
iters = 0;             
deltabm = ones(size(bm0));  
bm1 = bm0 + deltabm;    
while (iters<itermax)||(max(abs(deltabm))>errstol)
    deltabm  = pinv(PoissionJM(bm0,Y,X))*PoissionF(bm0,Y,X);
    bm1 = bm0 + deltabm;
    bm0  = bm1;   iters = iters +1;
end
bm = bm0;
fv1 = PoissionF(bm,Y,X);
fv2 = PoissionRegressopt(bm,Y,X);