当前位置:   article > 正文

数学建模之变量和相关性分析(含matlab代码_建模相关性分析

建模相关性分析

一、变量类型

 不同变量之间的使用

 二、相关系数及其检验

(1)Pearson相关系数:

适用于定距、定比类型的变量。是运用最广的一种相关程度统计量。检验用t统计量:其中统计量t服从自由度(n-2)的分布。

 

 使用条件
1、两变量均应由测量得到的连续变量
2、两变量所来自的总体都应是正态分布,或接近正态的单峰对称分布。
3、变量必须是成对的数据。
4、两变量间为线性关系。

(2)Spearman等级相关系数

 三、偏相关分析


1.偏相关分析的基本概念


在多变量的情况下,变量之间的相关关系是很复杂的。
如:农作物产量与降水量之间的关系中实际还包含温度对产量的影响。商品的需求与价格关系,注意收入水平的影响等等。
偏相关分析是指在对其他变量的影响进行控制的条件下,分析多个变量中某两个变量之间的线性相关程度,计算偏相关系数。

 例如:

 在现实经济生活中,由于收入和价格常常都有不断提高的趋势,如果不考虑收入对需求的影响,仅仅利用需求和价格的时间序列数据去计算简单相关系数,就有可能得出价格越高需求越大的错误结论。

 2、偏相关系数及其检验

 四、代码

1、皮尔逊函数

  1. function coeff = myPearson(X , Y)
  2. % 本函数实现了皮尔逊相关系数的计算操作
  3. % 皮尔逊相关系数计算公式(P18)及无偏相关系数矫正公式(P19)参见《现代气候统计诊断与预测技术》-魏凤英
  4. %
  5. % 输入:
  6. % X:输入的数值序列
  7. % Y:输入的数值序列
  8. %
  9. % 输出:
  10. % coeff:两个输入数值序列X,Y的相关系数
  11. %
  12. if length(X) ~= length(Y)
  13. error('两个数值数列的维数不相等');
  14. return;
  15. end
  16. fenzi = sum((X-sum(X)/length(X)).*(Y-sum(Y)/length(Y)));
  17. fenmu = sqrt(sum((X-sum(X)/length(X)).^2))*sqrt(sum((Y-sum(Y)/length(Y)).^2));
  18. coef = fenzi / fenmu;
  19. if length(X)>30
  20. coeff = coef;
  21. elseif length(X)>4 && length(X)<30
  22. coeff = coef*(1+(1-coef^2)/(2*(length(X)-4))); %计算无偏相关系数加以矫正
  23. else
  24. coeff = coef;
  25. fprintf('数据长度小于5 %8.4f\n',coeff);
  26. end
  27. end %函数myPearson结束

2、皮尔逊相关系数函数和T检验

  1. function ttest = myttest005(X , Y)
  2. if Y <= 2
  3. error('计算相关系数的样本量不够');
  4. return;
  5. end
  6. if X == NaN
  7. ttest = Z;
  8. return;
  9. end
  10. r2 = myPearson(X , Y);%计算pearson系数
  11. [m,n]=size(Y)
  12. Z = m-2;%求出自由度
  13. tvalue=abs(r2/(sqrt((1-r2^2)/Z)));
  14. if Z == 1
  15. tnorm = 12.71;
  16. if tvalue > tnorm
  17. ttest = Z;
  18. else
  19. ttest = NaN;
  20. end
  21. elseif Z == 2
  22. tnorm = 4.30;
  23. if tvalue > tnorm
  24. ttest = Z;
  25. else
  26. ttest = NaN;
  27. end
  28. elseif Z == 3
  29. tnorm = 3.18;
  30. if tvalue > tnorm
  31. ttest = Z;
  32. else
  33. ttest = NaN;
  34. end
  35. elseif Z == 4
  36. tnorm = 2.78;
  37. if tvalue > tnorm
  38. ttest = Z;
  39. else
  40. ttest = NaN;
  41. end
  42. elseif Z == 5
  43. tnorm = 2.57;
  44. if tvalue > tnorm
  45. ttest = Z;
  46. else
  47. ttest = NaN;
  48. end
  49. elseif Z == 6
  50. tnorm = 2.45;
  51. if tvalue > tnorm
  52. ttest = Z;
  53. else
  54. ttest = NaN;
  55. end
  56. elseif Z == 7
  57. tnorm = 2.37;
  58. if tvalue > tnorm
  59. ttest = Z;
  60. else
  61. ttest = NaN;
  62. end
  63. elseif Z == 8
  64. tnorm = 2.31;
  65. if tvalue > tnorm
  66. ttest = X;
  67. else
  68. ttest = NaN;
  69. end
  70. elseif Z == 9
  71. tnorm = 2.26;
  72. if tvalue > tnorm
  73. ttest = Z;
  74. else
  75. ttest = NaN;
  76. end
  77. elseif Z == 10
  78. tnorm = 2.23;
  79. if tvalue > tnorm
  80. ttest = Z;
  81. else
  82. ttest = NaN;
  83. end
  84. elseif Z == 11
  85. tnorm = 2.20;
  86. if tvalue > tnorm
  87. ttest = Z;
  88. else
  89. ttest = NaN;
  90. end
  91. elseif Z == 12
  92. tnorm = 2.18;
  93. if tvalue > tnorm
  94. ttest = Z;
  95. else
  96. ttest = NaN;
  97. end
  98. elseif Z == 13
  99. tnorm = 2.16;
  100. if tvalue > tnorm
  101. ttest = Z;
  102. else
  103. ttest = NaN;
  104. end
  105. elseif Z == 14
  106. tnorm = 2.15;
  107. if tvalue > tnorm
  108. ttest = Z;
  109. else
  110. ttest = NaN;
  111. end
  112. elseif Z == 15
  113. tnorm = 2.13;
  114. if tvalue > tnorm
  115. ttest = Z;
  116. else
  117. ttest = NaN;
  118. end
  119. elseif Z == 16
  120. tnorm = 2.12;
  121. if tvalue > tnorm
  122. ttest = Z;
  123. else
  124. ttest = NaN;
  125. end
  126. elseif Z == 17
  127. tnorm = 2.11;
  128. if tvalue > tnorm
  129. ttest = Z;
  130. else
  131. ttest = NaN;
  132. end
  133. elseif Z == 18
  134. tnorm = 2.10;
  135. if tvalue > tnorm
  136. ttest = Z;
  137. else
  138. ttest = NaN;
  139. end
  140. elseif Z == 19
  141. tnorm = 2.09;
  142. if tvalue > tnorm
  143. ttest = Z;
  144. else
  145. ttest = NaN;
  146. end
  147. elseif Z == 20
  148. tnorm = 2.09;
  149. if tvalue > tnorm
  150. ttest = Z;
  151. else
  152. ttest = NaN;
  153. end
  154. elseif Z == 21
  155. tnorm = 2.08;
  156. if tvalue > tnorm
  157. ttest = Z;
  158. else
  159. ttest = NaN;
  160. end
  161. elseif Z == 22
  162. tnorm = 2.07;
  163. if tvalue > tnorm
  164. ttest = Z;
  165. else
  166. ttest = NaN;
  167. end
  168. elseif Z == 23
  169. tnorm = 2.07;
  170. if tvalue > tnorm
  171. ttest = Z;
  172. else
  173. ttest = NaN;
  174. end
  175. elseif Z == 24
  176. tnorm = 2.06;
  177. if tvalue > tnorm
  178. ttest = Z;
  179. else
  180. ttest = NaN;
  181. end
  182. elseif Z == 25
  183. tnorm = 2.06;
  184. if tvalue > tnorm
  185. ttest = Z;
  186. else
  187. ttest = NaN;
  188. end
  189. elseif Z == 26
  190. tnorm = 2.06;
  191. if tvalue > tnorm
  192. ttest = Z;
  193. else
  194. ttest = NaN;
  195. end
  196. elseif Z == 27
  197. tnorm = 2.05;
  198. if tvalue > tnorm
  199. ttest = Z;
  200. else
  201. ttest = NaN;
  202. end
  203. elseif Z == 28
  204. tnorm = 2.05;
  205. if tvalue > tnorm
  206. ttest = Z;
  207. else
  208. ttest = NaN;
  209. end
  210. elseif Z == 29
  211. tnorm = 2.04;
  212. if tvalue > tnorm
  213. ttest = Z;
  214. else
  215. ttest = NaN;
  216. end
  217. elseif Z == 30
  218. tnorm = 2.04;
  219. if tvalue > tnorm
  220. ttest = Z;
  221. else
  222. ttest = NaN;
  223. end
  224. else
  225. tnorm = 1.96;
  226. if tvalue > tnorm
  227. ttest = X;
  228. else
  229. ttest = NaN;
  230. end
  231. end
  232. end %函数myttest005结束

3、Spearman函数

  1. function coeff = mySpearman(X , Y)
  2. % 本函数用于实现斯皮尔曼等级相关系数的计算操作
  3. %
  4. % 输入:
  5. % X:输入的数值序列
  6. % Y:输入的数值序列
  7. %
  8. % 输出:
  9. % coeff:两个输入数值序列X,Y的相关系数
  10. if length(X) ~= length(Y)
  11. error('两个数值数列的维数不相等');
  12. return;
  13. end
  14. N = length(X); %得到序列的长度
  15. Xrank = zeros(1 , N); %存储X中各元素的排行
  16. Yrank = zeros(1 , N); %存储Y中各元素的排行
  17. %计算Xrank中的各个值
  18. for i = 1 : N
  19. cont1 = 1; %记录大于特定元素的元素个数
  20. cont2 = -1; %记录与特定元素相同的元素个数
  21. for j = 1 : N
  22. if X(i) < X(j)
  23. cont1 = cont1 + 1;
  24. elseif X(i) == X(j)
  25. cont2 = cont2 + 1;
  26. end
  27. end
  28. Xrank(i) = cont1 + mean([0 : cont2]);
  29. end
  30. %计算Yrank中的各个值
  31. for i = 1 : N
  32. cont1 = 1; %记录大于特定元素的元素个数
  33. cont2 = -1; %记录与特定元素相同的元素个数
  34. for j = 1 : N
  35. if Y(i) < Y(j)
  36. cont1 = cont1 + 1;
  37. elseif Y(i) == Y(j)
  38. cont2 = cont2 + 1;
  39. end
  40. end
  41. Yrank(i) = cont1 + mean([0 : cont2]);
  42. end
  43. %利用差分等级(或排行)序列计算斯皮尔曼等级相关系数
  44. fenzi = 6 * sum((Xrank - Yrank).^2);
  45. fenmu = N * (N^2 - 1);
  46. coeff = 1 - fenzi / fenmu;
  47. end %函数mySpearman结束

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/127976
推荐阅读
相关标签
  

闽ICP备14008679号