断点分析法_局部线性回归_matlab

本文介绍断点分析法在数据作假方面的应用:

一、题目:

近年来空气质量问题始终是政府、环境保护部门和全国人民关注的热点问题。为了激励城市政府重视空气污染治理,地方官员的政绩考核中往往包括诸如“蓝天数”这样的指标,即全年空气污染指数低于100点的天数。搜集相关空气质量和气候数据,利用数学模型分析其数据的真实性。

二、思路:

使用不连续回归分析的方法。经验判断,在API为100左右最可能发生数据的操作,因为如果数据修改幅度过大,可能会引起公众和其他政府官员的怀疑,因为公众可以获得每日API指数;但是API指数在和左右是难以辨别的,在这里修改数据也不易被发现。因此,在存在数据被修改的情况下可能会存在断点。依据判断空气质量数据的概率密度分布曲线是否在达标指数附近存在不连续,我们可以初步判断数据是否被人为修改。

三、说明:

断点分析法一般需要在潜在断点左右两侧分别进行局部回归(一般的回归在边界处的估计存在较大偏差,采用局部线性回归可以很好的解决边界问题);而局部回归多采用局部多项式回归,局部线性回归是局部多项式回归的特例,因为其算法较为简单且性能优越,我们这里采用局部线性回归。

四、断点分析法步骤:

1.在100左右两侧分别进行频率分直方图的建立(这里的 100 是API值,但是具体的程序中我们使用的是每一项污染物的浓度。SO2、PM10为150,NO2为120(这里的值是API为100时对应的值),单位为:微克每立方米。至于为什么使用污染物浓度,而不使用API值,原因是API的计算函数为分段函数,本身就不具有连续性。)

2. 取直方图的中点作为自变量,对应的概率密度作为应变量(到这里为止,我们得到拟合所要数据)

3.对左右两侧的数据分别进行局部线性回归

4.以下图为例:

定性分析:在150(这里分析的是PM10,所以是150)左侧明显存在不连续,说明很有可能存在数据作假。

定量分析:可以使用150的左右极限的差值的大小定量分析数据作假的可能性

说明1:差值越大,表示越有可能发生数据操作,不代表作假的程度越大

说明2:局部线性回归的带宽与直方图组距的选择很重要(后面有提到)

 

五、局部多项式回归:

1.局部线性的回归的简单介绍:

多项式回归模型如下:

其中 m(x) 表示回归函数,y_i 表示第个 i 采样点 x_i 处的采样值,ε_i表示独立分布零均值噪声

在 m(x) 的形式未确定的情况下,假设是 N 阶局部平滑的,为了估计函数在给定数据下的任意点处的值,我们可以将函数在这一点局部展开。假设 X_i 是 X 附近的采样点,则有N阶泰勒展开式:

首先定义权函数:

  

其中 为核函数,它以估计点为中心,用来控制各个采样点的权重:距离 X 越近的点,权重越大,h 为带宽(平滑参数),用于控制核的尺度。核函数K( ) 形式不固定,需满足关于 y 轴对称并在零点处取最大值,在这里我们使用高斯核

选择 m(x) 来使得下面的局部加权平方和 Q 最小。

估计依赖于目标值 X ,最终有

当N=1,为局部线性回归,因为其算法较为简单且性能优越,所以我们采用局部线性回归分别对临界值左右两侧的数据进行拟合。

2.局部多项式回归的目标函数详解:

解释1.这个式子看起来与最小二乘法回归很相似,但是最大的不同就在前面的权函数!里面存在变量x,也是就是说,当计算每一个x的估计值y时,上面的方程就会发生变换!也就是说每计算一个点,就要做计算一次参数

解释2.为什么前面存在权函数,就会达到局部拟合的目的?局部拟合的思想从何而来?

如果不考虑权函数的情况下,也就是最小二乘法求解方程组。

这组方程最后的目标函数是下面的式子。我们只求两个参数,显然方程超过了两个,下面目标函数的思想就是,既然不能解,那么让(方程右边-方程左边)^2尽可能小,最后累加起来尽可能小。

问题来了?哪个方程起的作用大呢(最小二乘拟合认为每个方程起的作用一样)?->第二节中的泰勒展开的条件是, X_i 是 X 附近的采样点,如果X_i 离X 很远,那么泰勒公式显然不成立!也就是最小二乘拟合就是强行求解参数!这样局部拟合的思想产生,如果X_i 离X 很远,对应的方程应该作用小,也就是权函数起到的作用。

3.局部线性参数的求解:

分别求 的偏导数,并让它们等于零,这里以线性回归进行局部的拟合,所以只需求的偏导数。

引入矩阵

整理关于的线性方程组,使用矩阵表示如下:

存在,则有:

所以有 y 的估计值:

4.直方图组距与核函数带宽的选取:

进行局部线性回归进行估计分两步:第一步需确保箱体大到包含足够多的样本使其样本点在临界值两边都比较平滑,但又要小到一定程度使得样本点在临界值处的跳跃能都明显的显现出来,这就需要选择合适的b;第二步以直方图箱体的中点作为观测变量,以对应的概率密度作为结果变量,采用局部线性估计y。但是潜在的不连续点不应包括在箱体中,分别在潜在不连续点左右两侧进行直方图的绘制,获得对应的样本点。

因所获得数据较少,b选择不易过大,但是不宜过小。我们使用的标准差。带h宽控制着核函数权重变化的速率,即用来控制核的尺度,我们使用McCrary建议的带宽选择是a>10,这里我们可以尝试选择。(这里的带宽选择依据Dalia Ghanem这一篇文章:Effortless Perfection:’ Do Chinese Cities Manipulate Air Pollution Data,这一篇文章附录A中有详细描述带宽的选择,这里是这么解释的)

说明:组距与带宽的选择有专门的研究,这里不进行深入研究,大家可以根据实际情况进行合适的选择。下图说明:当带宽选择不当会出现过拟合与欠拟合。

 补充:参见McCrary的文章:Manipulation of the runningvariable in the regression discontinuity design:A density test。里面对于带宽的选择建议是这样的:

自己的见解:McCrary提出的这个带宽选择,可以简化为Dalia Ghanem文章中的​​,自己选择合适的a即可。正如Dalia Ghanem所说,我们不一定都要选择4次多项式拟合间断点两边的曲线,正常局部线性(1次)即可完成大多数的拟合。

以下是matlab代码:

% local_linear_regression:
% author:ncf 
% email:1476879092@qq.com  
% log:  
% 2016-7-12:Complete  
% 2017-3-19:Modification
%% 局部线性拟合   
PM10 = xlsread('data.xlsx');
data = PM10;  
  
cut_off = 150; % cut_off 是相应的断点,对于 NO2 断点为 120 ,SO2、PM10 为150 (这里的数值其实是浓度,单位为微克每立方米(10^-6))
x_lim_all = [min(PM10),max(PM10)];  
  
% 获取 150 左侧的样本点  
data_low = data(data<cut_off);  
bin_width_low = 2*std(data_low)/sqrt(length(data_low));  
bin_num_low = (cut_off-min(data_low))/bin_width_low;  
[y_low,x_low] = hist(data_low,bin_num_low);  
y_low=y_low/length(PM10)/mean(diff(x_low));  
% 注:
    % 如果出现了数据量不够,那么直方图分组后,会出现部分的组数据很少甚至没有(特别是组距较小时),这时我们可以考虑将这部分数据删去,可以减少对拟合的影响
    % x_low(y_low==0) = [];  
    % y_low(y_low==0) = [];  
    
% 获取 150 右侧的样本点  
data_up = data(data>cut_off);  
bin_width_up = 2*std(data_up)/sqrt(length(data_up));  
bin_num_up = (max(data_up)-cut_off)/bin_width_up;  
[y_up,x_up] = hist(data_up,bin_num_up);  
y_up=y_up/length(PM10)/mean(diff(x_up));   
    % x_up(y_up==0) = [];  
    % y_up(y_up==0) = [];  
  
y_lim_all = [min([min(y_low) min(y_up)]) max([max(y_low) max(y_up)])];  
  
% 绘制样本点  
colors = ['m' 'c' 'k' 'r' 'g'];   
figure;  
hold on;  
plot([x_low x_up],[y_low y_up],'.b');  

% 局部线性拟合  
% 150 左侧拟合  
h_bandwidth = [5*bin_width_low 15*bin_width_low 20*bin_width_low]; % bandwidth  
[x_low_fit,y_low_fit] = local_linear_fit(x_low',y_low',h_bandwidth);  
for k = 1:length(h_bandwidth)  
    plot(x_low_fit(:,k),y_low_fit(:,k),colors(k))  
end  
% 150 右侧拟合  
h_bandwidth = [10*bin_width_up 15*bin_width_up 20*bin_width_up]; % bandwidth  
[x_up_fit,y_up_fit] = local_linear_fit(x_up',y_up',h_bandwidth);  
for k = 1:length(h_bandwidth)  
    plot(x_up_fit(:,k),y_up_fit(:,k),colors(k))  
end  
  
legend('trainingdata','a=10,','a=15','a=20')  
axis([x_lim_all*1.1 y_lim_all*1.1])  
%% 鲁棒性带宽过大过小的比较
figure;
hold on;
plot([x_low x_up],[y_low y_up],'.b');
% 局部线性拟合
h_bandwidth = [1*bin_width_low 15*bin_width_low 30*bin_width_low]; % bandwidth
[x_low_fit,y_low_fit] = local_linear_fit(x_low',y_low',h_bandwidth);
for k = 1:length(h_bandwidth)
    plot(x_low_fit(:,k),y_low_fit(:,k),colors(k))
end

h_bandwidth = [1*bin_width_up 15*bin_width_up 30*bin_width_up]; % bandwidth
[x_up_fit,y_up_fit] = local_linear_fit(x_up',y_up',h_bandwidth);
for k = 1:length(h_bandwidth)
    plot(x_up_fit(:,k),y_up_fit(:,k),colors(k))
end

legend('trainingdata','a=1,','a=15','a=30') % 当带宽选择不当,会出现过拟合与欠拟合
axis([x_lim_all*1.1 y_lim_all*1.1])

以下为使用matlab编写的局部线性回归函数:(matlab中没有该函数,该函数中附有编者邮箱,具体问题可以交流)

function [fit_x,fit_y] = local_linear_fit(x,y,h_bandwidth)  
% local_linear_fit:local linear regression  
%   [fit_x,fit_y] = local_linear_fit(x,y,h_bandwidth),x: independent  
%   variable,y:dependent variable,h_bandwidth:bandwidth  
%   
% author:ncf 
% email:1476879092@qq.com  
% log:  
% 2016-7-12:Complete  
% 2017-3-19:Modification
  
% column matrix  
test_sample_x = x;  
test_sample_y = y;  
  
test_sample_X = [ones(length(test_sample_x),1) test_sample_x];  
  
num_x = length(test_sample_x);   
% Weight_speed  
Weight_speed = 1;  
  
%% linear fit  (basic knowledge)
% line_fit_beta = (test_sample_X'*test_sample_X)\(test_sample_X'*test_sample_y);  
% line_fit_y = line_fit_beta(1) + line_fit_beta(2)*test_sample_x;  


%% local linear fit  
% fit_x and fit_y  
fit_x = min(test_sample_x):0.3:max(test_sample_x);  
fit_y = zeros(length(test_sample_x),length(h_bandwidth));  
  
for k_bandwidth = 1:length(h_bandwidth)  
    h = h_bandwidth(k_bandwidth);  
    for k_fit_y = 1:length(fit_x)  
        w = zeros(num_x,num_x);  
        K_h_all = zeros(num_x,1);  
        % compute K_h  
        for k_w = 1:num_x  
            K_h_all(k_w) = gaussian_kernel((fit_x(k_fit_y)-test_sample_x(k_w))/h,Weight_speed)/h;  
        end  
        sum_K_h_all = sum(K_h_all);  
        % compute w  
        for k_w = 1:num_x  
           w(k_w,k_w) = K_h_all(k_w)./sum_K_h_all;  
        end  
        local_beta = (test_sample_X'*w*test_sample_X)\(test_sample_X'*w*test_sample_y);  
        fit_y(k_fit_y,k_bandwidth) = local_beta(1)+local_beta(2)*fit_x(k_fit_y);  
    end  
end  
 
fit_x = [fit_x',fit_x',fit_x'];  

以下为高斯核函数:

function k = gaussian_kernel(x,Weight_speed)
% Weight_speed 越大,权值变化越慢

k = (1/(sqrt(2*pi)))*exp(-(x^2)/(2*Weight_speed^2));

参考文献:

[1]McCrary, Justin. 2008. “Manipulation of the runningvariable in the regression discontinuity design:A density test.” Journal of Econometrics 142 (2):698–714.

[2]张煜东,颜俊,王水花,吴乐南.非参数估计方法[J].武汉工程大学学报,2010,99-106.

[3]Ghanem,D., & Zhang, J. (2014). ‘Effortlessperfection:’ Do Chinese cities manipulate air pollutiondata?. Journal of Environmental Economics and Management, 68(2), 203-225.

[4]欧祖军,李洪毅.局部多项式估计的带宽选择[J].长春大学学报,2007,17-19.

[5]https://zhuanlan.zhihu.com/p/30422174

[6]Ghanem D, Zhang J. ‘Effortless Perfection:’Do Chinese cities manipulate air pollution data?[J]. Journal of Environmental Economics and Management, 2014, 68(2): 203-225.

注:

1.为了方便读者理解,本博客进行了更新,并提供matlab代码与一组数据:
http://pan.baidu.com/s/1gfcbOWj

2.依据本文提供公式,读者可以自行编写程序,请仔细阅读

3.博文中附有博主邮箱,1476879092@qq.com

4.带宽的问题可以参考本文提到的参考文献,也可以自行百度查找相关文献

5.2020.7.6更新带宽选择部分的说明。

评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nachifur

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值