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