基于面板数据的熵值法
說明:對(duì)含年份、城市、指標(biāo)的面板數(shù)據(jù)使用熵值法為各指標(biāo)進(jìn)行客觀賦權(quán),從而得出各城市的綜合得分。本文對(duì)基于面板數(shù)據(jù)的熵值法公式做出解釋并給出MATLAB代碼實(shí)現(xiàn)。
公式理解1
-
Step1:指標(biāo)選取。設(shè)有rrr個(gè)年份,nnn個(gè)城市,mmm個(gè)指標(biāo),則Xθij\mathrm{X}_{θij}Xθij?表示第θθθ年,第iii個(gè)地級(jí)市,第jjj個(gè)指標(biāo)的值。
-
Step2:指標(biāo)標(biāo)準(zhǔn)化處理。由于不同的指標(biāo)具有不同的量綱和單位,因此需要進(jìn)行標(biāo)準(zhǔn)化處理。
正向指標(biāo)(數(shù)值越大越好)標(biāo)準(zhǔn)化: Xθij′=Xθij?XminXmax?Xmin\mathrm{X}^{\prime} _{\theta \mathrm{ij}}=\frac{\mathrm{X} _{\theta \mathrm{ij}}-\mathrm{X_{min}}}{\mathrm{X_{max}}-\mathrm{X_{min}}}Xθij′?=Xmax??Xmin?Xθij??Xmin?? ;負(fù)向指標(biāo)(數(shù)值越小越好)標(biāo)準(zhǔn)化:Xθij′=Xmax?XθijXmax?Xmin\mathrm{X}^{\prime} _{\theta \mathrm{ij}}=\frac{\mathrm{X_{max}}-\mathrm{X} _{\theta \mathrm{ij}}}{\mathrm{X_{max}}-\mathrm{X_{min}}}Xθij′?=Xmax??Xmin?Xmax??Xθij??
其中,Xmax\mathrm{X_{max}}Xmax?、Xmin\mathrm{X_{min}}Xmin?表示第jjj個(gè)指標(biāo)在第iii個(gè)城市rrr個(gè)年份中的最大、最小值,即取每個(gè)指標(biāo)全部年份的最大、最小值。指標(biāo)標(biāo)準(zhǔn)化處理后,Xθij′\mathrm{X}^{\prime} _{\theta \mathrm{ij}}Xθij′?的取值范圍為[0,1][0,1][0,1],表示Xθij′\mathrm{X}^{\prime} _{\theta \mathrm{ij}}Xθij′?在nnn個(gè)城市rrr個(gè)年份中的相對(duì)大小。
注意:Xmax\mathrm{X_{max}}Xmax?、Xmin\mathrm{X_{min}}Xmin?不能是當(dāng)年的最大、最小值,而是所有年份中的。若是當(dāng)年的最大最小值,那么每年指標(biāo)數(shù)值相近,不利于后續(xù)分析
-
Step3:非負(fù)平移。 Xθij′=Xθij′+0.001\mathrm{X}^{\prime} _{\theta \mathrm{ij}}=\mathrm{X}^{\prime} _{\theta \mathrm{ij}}+0.001Xθij′?=Xθij′?+0.001
標(biāo)準(zhǔn)化后,可能會(huì)對(duì)小于等于0的數(shù)字取對(duì)數(shù),從而產(chǎn)生null值或nan。一般采用非負(fù)平移,即對(duì)所有數(shù)據(jù)加上很小的數(shù)。
-
Step4:計(jì)算權(quán)重: Yθij=Xθij′/∑θr∑inXθij′\mathrm{Y}_{\theta \mathrm{ij}}=\mathrm{X}_{\theta \mathrm{ij}}^{\prime} / \sum\limits_{\theta}^r \sum\limits_{\mathrm{i}}^n \mathrm{X}^{\prime} _{\theta \mathrm{ij}}Yθij?=Xθij′?/θ∑r?i∑n?Xθij′?
-
Step5:計(jì)算熵值: Sj=?k∑θr∑in(Yijln?(Yθij)),k=1/ln(rn)\mathrm{S}_{\mathrm{j}}=-\mathrm{k} \sum\limits_{\theta}^r \sum\limits_{\mathrm{i}}^n (\mathrm{Y}_{\mathrm{ij}} \ln \left(\mathrm{Y}_{\theta \mathrm{ij}}\right)), \mathrm{k}=1 / \mathrm{ln}(\mathrm{rn})Sj?=?kθ∑r?i∑n?(Yij?ln(Yθij?)),k=1/ln(rn)
-
Step6:計(jì)算差異系數(shù)。第jjj項(xiàng)指標(biāo)的差異系數(shù) : Ej=1?Sj\mathrm{E}_{\mathrm{j}}=1-\mathrm{S}_{\mathrm{j}}Ej?=1?Sj?
-
Step7:計(jì)算第jjj指標(biāo)的權(quán)重: Wj=Ej/∑jmEj\mathrm{W}_{\mathrm{j}}=\mathrm{E}_{\mathrm{j}} / \sum\limits_{\mathrm{j}}^m \mathrm{E}_{\mathrm{j}}Wj?=Ej?/j∑m?Ej?
-
Step8:計(jì)算每個(gè)城市每個(gè)年份下的綜合得分。指標(biāo)權(quán)重與標(biāo)準(zhǔn)化后的指標(biāo)值乘積: Hθi=∑jm(Wj(Xθij′)T)\mathrm{H}_{\theta \mathrm{i}}=\sum\limits_{\mathrm{j}}^m \left(\mathrm{W}_{\mathrm{j}} (\mathrm{X}_{\theta \mathrm{ij}}^{\prime}\right)^\mathrm{T})Hθi?=j∑m?(Wj?(Xθij′?)T)
代碼實(shí)現(xiàn)
輸入與輸出
以data.xlsx為輸入的數(shù)據(jù)文件,指標(biāo)數(shù)據(jù)排列如下。
輸出結(jié)果為各個(gè)指標(biāo)的權(quán)重和各年度各城市的綜合指數(shù)
MATLAB實(shí)現(xiàn)
僅供測(cè)試用數(shù)據(jù):https://download.csdn.net/download/what_how_why2020/84855240
以下代碼測(cè)試于MATLAB 2020b
clear, clc;%% 讀取數(shù)據(jù) % 以下兩種讀取數(shù)據(jù)的方式任選其一即可% 方式一,推薦,MATLAB 2013b及以上版本 % data是表結(jié)構(gòu) data = readtable('data.xlsx', 'PreserveVariableNames', true); % 讀取data.xlsx表格中數(shù)據(jù),需包含所有年份的所有指標(biāo)。 % 「修改」:“3:11”為第3列至11列數(shù)據(jù) data1 = data(:, 3:11); % 轉(zhuǎn)成矩陣,以便使用max等函數(shù) data1 = table2array(data1);% 方式二 % 「修改」參數(shù)依次是:文件名、工作簿名、單元格位置名 data1 = xlsread('data.xlsx', 'sheet', 'C2:K97');%% 標(biāo)準(zhǔn)化 max_indicator = max(data1); % 每個(gè)指標(biāo)的最大值 min_indicator = min(data1); % 每個(gè)指標(biāo)的最小值 diff_indicator = max_indicator - min_indicator; % 差值% 正負(fù)指標(biāo)矩陣。0表示正指標(biāo)歸一化;1表示負(fù)指標(biāo)歸一化 % 「修改」:根據(jù)實(shí)際數(shù)據(jù)的正負(fù)指標(biāo)情況,對(duì)向量 Indicator_Type 做出修改 Indicator_Type = [0 0 1 0 1 0 0 0 0]; [data1_line, data1_column] = size(data1);for i = 1:data1_linefor j = 1:data1_columnif Indicator_Type(j) == 0% 正指標(biāo)歸一化normal_result(i,j) = (data1(i,j) - min_indicator(j)) / diff_indicator(j);else% 負(fù)指標(biāo)歸一化normal_result(i,j) = (max_indicator(j) - data1(i,j)) / diff_indicator(j);endend end % 非負(fù)平移,對(duì)所有數(shù)值都加上0.001 normal_result = normal_result + 0.001%% 計(jì)算權(quán)重 sum_column = sum(normal_result); for j = 1:data1_columnfor i = 1:data1_lineY(i, j) = normal_result(i, j)/sum_column(j)end end%% 計(jì)算熵值 year_num = 6; % 「修改」年份數(shù) city_num = 16; % 「修改」城市數(shù) k = 1 / log(year_num*city_num);for j = 1:data1_columnfor i = 1:data1_linetemp_a(i, j) = Y(i, j).*log(Y(i, j));end endS = -k * sum(temp_a)%% 計(jì)算第j項(xiàng)指標(biāo)的差異系數(shù) E = ones(1, data1_column) - S;%% 計(jì)算第j項(xiàng)指標(biāo)權(quán)重 sum_E = sum(E); for j = 1:data1_columnW(j) = E(j)/sum_E; end%% 計(jì)算綜合得分 H = W*normal_result'; % 生成city_num個(gè)行、year_num個(gè)列的矩陣,final_result(city_num, year_num)表示某城市在某年的綜合水平 final_result = reshape(H', city_num, year_num);advance
獲取各年度各城市在每個(gè)一級(jí)指標(biāo)下的綜合得分2:。暫無簡單的代碼實(shí)現(xiàn)思路,推薦使用Excel
可能遇到的問題
以下為博主編寫熵值法代碼過程中遇到的問題,現(xiàn)已解決,可供讀者參考。
報(bào)錯(cuò)原因:sum函數(shù)的參數(shù)類型需為矩陣,而非表,使用readtable()函數(shù)導(dǎo)入數(shù)據(jù)時(shí),返回值的數(shù)據(jù)類型為表table
解決方法:若是使用readtable()函數(shù)所導(dǎo)致的此問題,使用table2array()轉(zhuǎn)換數(shù)據(jù)類型即可
報(bào)錯(cuò)原因:數(shù)據(jù)中本身含有NaN;分?jǐn)?shù)計(jì)算中分母為0
解決方法:檢查數(shù)據(jù)和計(jì)算過程
參考資料:
楊麗與孫之淳, 基于熵值法的西部新型城鎮(zhèn)化發(fā)展水平測(cè)評(píng). 經(jīng)濟(jì)問題, 2015(03): 第115-119頁. ??
馬茹,羅暉,王宏偉,王鐵成.中國區(qū)域經(jīng)濟(jì)高質(zhì)量發(fā)展評(píng)價(jià)指標(biāo)體系及測(cè)度研究[J].中國軟科學(xué),2019(07):60-67. ??
matlab錯(cuò)誤使用 sum 數(shù)據(jù)類型無效。第一個(gè)參數(shù)必須為數(shù)值或邏輯值。解決方法_歲月不負(fù)人的博客-CSDN博客 ??
為什么Matlab運(yùn)行的結(jié)果是NaN呢,急盼解答 – MATLAB中文論壇 (ilovematlab.cn) ??
總結(jié)
以上是生活随笔為你收集整理的基于面板数据的熵值法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VirtraulBox中安装Ubuntu
- 下一篇: stata基础知识