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

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

题目:

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

思路:

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

说明:

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

断点分析法步骤:

1.在100左右两侧分别进行频率分直方图的建立(程序中有体现)

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

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

4.以下图为例:

定性分析:在150左侧明显存在不连续,说明很有可能存在数据作假。

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

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

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

局部多项式回归:

多项式回归模型如下:

其中 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,为局部线性回归,因为其算法较为简单且性能优越,所以我们采用局部线性回归分别对临界值左右两侧的数据进行拟合。

局部线性参数的求解:

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

引入矩阵

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

存在,则有:

所以有 y 的估计值:

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

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

因所获得数据较少,b选择不易过大,但是不宜过小。我们使用的标准差。带h宽控制着核函数权重变化的速率,即用来控制核的尺度,我们使用McCrary建议的带宽

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

以下是matlab代码:

%% 局部线性拟合
PM10 = NO2;
data = PM10(2:482);

cut_off = 120;
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
local_linear_fit(x_low',y_low',h_bandwidth)

h_bandwidth = [1*bin_width_up 15*bin_width_up 30*bin_width_up]; % bandwidth
local_linear_fit(x_up',y_up',h_bandwidth)

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
%
% ncf,July,2016
% Email:[email protected]
% log:
% 2016-7-12:Complete

% 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
% 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;
% plot(test_sample_x,line_fit_y,'b')
%% 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));

% colors = ['m' 'c' 'k' 'r' 'g']; 

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
%     plot(fit_x,fit_y,colors(k_bandwidth))
end
% legend('trainingdata','linear','r=.1','r=.3','r=.8,','r=2','r=10');
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.

时间: 2024-08-04 09:42:47

断点分析法_局部线性回归_matlab的相关文章

【龙书笔记】用Python实现一个简单数学表达式从中缀到后缀语法的翻译器(采用递归下降分析法)

上篇笔记介绍了语法分析相关的一些基础概念,本篇笔记根据龙书第2.5节的内容实现一个针对简单表达式的后缀式语法翻译器Demo. 备注:原书中的demo是java实例,我给出的将是逻辑一致的Python版本的实现. 在简单后缀翻译器代码实现之前,还需要介绍几个基本概念. 1. 自顶向下分析法(top-down parsing) 顾名思义,top-down分析法的思路是推导产生式时,以产生式开始符号作为root节点,从上至下依次构建其子节点,最终构造出语法分析树.在具体实现时,它会把输入字符串从左到右

测试用例设计方法---边界值分析法

边界值分析法学习目标掌握边界值分析法设计测试用例掌握边界值分析法取值范围的确定掌握离点的划分方法 1.为什么要学习边界值分析法案例:两位数加法计算器要求:输入两个1-100之间整数的和请猜测程序为什么会出现上述问题?输入的参数值必须大于0同时小于100的整数,边界条件设置错误:把>写成了>=,把<写成了<=[注意]有效数据和无效数据的分界点,往往作为程序员编写程序的判断点,是程序员容易犯错误的地方, 也是测试人员重点测试的内容.2.什么是边界边界是指对于输入等价类和输出等价类而言,

层次分析法

title: 层次分析法 date: 2020-02-25 19:14:41 categories: 数学建模 tags: [MATLAB, 评价模型] mathjax: true 定义 ? 层次分析法(The Analytic Hierarchy Process即AHP)是由美国运筹学家. 匹兹堡大学教授T . L. Saaty于20世纪70年代创立的一种系统分析与决策的综合 评价方法,是在充分研究了人类思维过程的基础上提出来的,它较合理地解 决了定性问题定量化的处理过程. ? AHP的主要特

【转】LR分析法

转自:http://guanjy0129.blog.163.com/blog/static/1115494452010614113333509/ LR分析法的归约过程是规范推导的逆过程,所以LR分析过程是一种规范归约过程. LR分析法正是给出一种能根据当前分析栈中的符号串(通常以状态表示)和向右顺序查看输入串的K个(K≥0)符号就可唯一地确定分析器的动作是移进还是归约和用哪个产生式归约,因而也就能唯一地确定句柄. 其中LR(0)分析器是在分析过程中不需向右查看输入符号,因而它对文法的限制较大,然

u-boot启动流程分析(2)_板级(board)部分

转自:http://www.wowotech.net/u-boot/boot_flow_2.html 目录: 1. 前言 2. Generic Board 3. _main 4. global data介绍以及背后的思考 5. 前置的板级初始化操作 6. u-boot的relocation 7. 后置的板级初始化操作 1. 前言 书接上文(u-boot启动流程分析(1)_平台相关部分),本文介绍u-boot启动流程中和具体版型(board)有关的部分,也即board_init_f/board_i

LL(1)分析法

LL(1)分析法又叫预测分析法,是一种不带回溯的非递归自顶向下的分析法. LL(1)是不带回溯的非递归的分析法是因为,它每次都只有一个可用的产生式,所以是不带回溯和非递归的,当无法处理输入符号时,即出错. 第一个L表示是从左到右扫描输入串,第二个L表示推导过程中使用最左推导,(1)表明只需要向右看一个符号,就可以决定如何推导的(即知道用哪个产生式进行推导). 什么是LL(1)分析法 LL(1)分析法的原理是这样的,它的基本思想是根据输入串的当前输入符号来唯一确定选用哪个产生式来进行推导. 比如当

建模算法(十一)&mdash;&mdash;层次分析法

(一)层次分析法的基本原理与步骤 一.步骤 1.建立递阶层次结构模型 2.构造出各层次中的所有判断矩阵 3.层次单排序及一致性检验 4.层次总排序及一致性检验 二.递阶层次的建立与特点 1.分层: (1)最高层:这一层次中只有一个元素,一般它是分析问题的预定目标和理想结果. (2)中间层:这一层次中包含为了实现目标所涉及的中间环节,主要是一些考虑指标和一些准则. (3)最底层:这一层次中包含为了实现目标可供选择的各种方案. 2.注意点: 一般不要1层不要超过9个因素 3.一个demo 是三个旅游

实验三 递归下降分析法

实验三递归下降分析程序实验 专业 商软2班   姓名 蓝海鹏  学号 201506110171 一.        实验目的      编制一个使用递归下降分析法实现的语法分析程序. 二.        实验内容和要求 输入:正规式 输出:判断该正规式是否正确. 三.        实验方法.步骤及结果测试 1.      源程序名:171-蓝海鹏.c 可执行程序名:171蓝海鹏.exe 2.      原理分析及流程图 3.      主要程序段: 1 #include<stdio.h> 2

软件测试- 测试用例之边界值分析法

根据大量的测试统计数据,很多错误是发生在输入或输出范围的边界上,而不是发生在输入/输出范围的中间区域.因此针对各种边界情况设计测试用例,可以查出更多的错误. 比如一个文本框的可输入字符长度为0~15,那么咱们在测试的时候就会习惯性的输入0个或者16个以上的字符,试试程序会不会报错,因为直觉告诉我们这样出错的几率比较大.这就是在不自觉中应用了边界值分析法. 概念 边界值分析法就是对输入或输出的边界值进行测试的一种黑盒测试方法.通常边界值分析法是作为对等价类划分法的补充,这种情况下,其测试用例来自等