您的当前位置:首页正文

利用R求简单相关系数及其显著性检验

2023-10-19 来源:好走旅游网
题目:

测定“丰产三号”小麦的每株穗数x1,主茎上每穗结实小穗数x2,百粒重x3(单位:g),主茎株高x4(单位:cm)和每株籽粒产量y(单位:g)的15组观测值如下表,试计算其简单相关系数并作相关系数的显著性检验。 i xi1 xi2 xi3 xi4 y 1 10 23 3.6 113 15.7 2 9 20 3.6 106 14.5 3 10 22 3.7 111 17.5 4 13 21 3.7 109 22.5 5 10 22 3.6 110 15.5 6 10 23 3.5 103 16.9 7 8 23 3.3 100 8.6 8 10 24 3.4 114 17 9 10 20 3.4 104 13.7 10 10 21 3.4 110 13.4 11 10 23 3.9 104 20.3 12 8 21 3.5 109 10.2 13 6 23 3.2 114 7.4 14 8 21 3.7 113 11.6 15 9 22 3.6 105 12.3 丰产3号 小麦栽培试验的观测值

利用R软件自带函数计算简单相关系数及其检验p值:

利用R软件自带的计算简单相关系数的函数cor( )得到简单相关系数表: x1 x2 x3 x4 y x1 1.0000 -0.1357 0.5007 -0.0939 0.8973 x2 -0.1357 1.0000 -0.1489 0.1234 0.0461 x3 0.0057 -0.1489 1.0000 -0.0358 0.6890 x4 -0.0939 0.1234 -0.0358 1.0000 -0.0065 y 0.8973 0.0462 0.6890 -0.0065 1.0000 再调用cor.test( )函数得到相关系数检验的p值表: x2 x3 x4 y x1 0.6294 -0.05728 0.7392 5.75e-06** x2 0.5964 0.6613 0.8702 x3 0.8991 0.004499** x4 0.9816

手工编写相关系数计算函数和检验函数:

COR.test = function(X,R); COR = function(X); lxy = function(x,y);

#求F检验的p值,为矩阵形式 #求相关系数,为矩阵形式 #各个观测值之间的离均差乘积

得到的简单相关系数表:

x1 x2 x3 x4 y x1 1.0000 -0.1357 0.0057 -0.0939 0.8973 x2 -0.1357 1.0000 -0.1489 0.1234 0.0462 x3 0.5007 -0.1489 1.0000 -0.0358 0.6890 x4 -0.0939 0.1234 -0.0358 1.0000 -0.0065 y 0.8973 0.0461 0.6890 -0.0065 1.0000 得到的检验p值表: x1 x2 x3 x4 y x1 0.00000 0.62960 0.05728 0.73920 5.75E-06 x2 0.62960 0.00000 0.59641 0.66130 0.87020 x3 0.05728 0.59641 0.00000 0.89910 0.00450 x4 0.73920 0.66130 0.89913 0.00000 0.98160 y 0.00001 0.87020 0.00450 0.98160 0.00000 与R软件自带的函数得到的结果相比较,可以看出相关系数结果一致,检验p值偏差可以忽略。

各个函数具体代码如下:

COR.test = function(X,R){options(digits = 4) #求F检验的p值,为矩阵形式 n = dim(X)[2]; #得到p矩阵的阶数 p = diag(0,n) ; #n阶零矩阵 for (i in 1:n) { for (j in 1:n){ f = R[i,j]^2/((1-R[i,j]^2)/(dim(X)[1]-2)); #用F检验对相关系数作显著性检验 p[i,j]=1-pf(f,1,dim(X)[1]-2); #用F检验计算p值 } } p }

COR = function(X){options(digits = 3) #求相关系数,为矩阵形式 n = dim(X)[2]; #得到相关系数矩阵的阶数 Y = diag(n); #产生单位矩阵

for (i in 1:n) for( j in 1:n) Y[i,j] = lxy(X[,i],X[,j])/sqrt(lxy(X[,i],X[,i])*lxy(X[,j],X[,j]));#简单相关系数计算公式 Y }

lxy = function(x,y){ #各个观测值之间的离均差乘积 n = length(x) sum(x*y) - sum(x)*sum(y)/n }

f_COR = function(R){ #复相关系数,R为简单相关系数矩阵 R = solve(R) #简单相关系数矩阵的逆矩阵 n = dim(R)[1] r = numeric(n) #产生n阶零向量 for (i in 1:n){ r[i] = sqrt(1 - 1/R[i,i]) 复相关系数的计算公式 } r }

p_COR = function(X,R){ #偏相关系数,X为输入数据框或者矩阵,R为简单相关系数矩阵 R = solve(R) #简单相关系数矩阵的逆矩阵 n = dim(R)[1] n1 = dim(X)[1] p = dim(X)[2] - 1 #自由度为n1-p-1 r = diag(0,n) #产生n阶零矩阵 for (i in 1:(n - 1)){ #对角线以上部分 for (j in (i + 1):n){ r[i,j] = -(1)*R[i,j]/sqrt(R[i,i]*R[j,j]) #偏相关系数计算公式 } }

for (i in 1:(n - 1)){ for (j in (i + 1):n){ #对角线以下部分 F = r[i,j]^2/(1 - r[i,j]^2)*( n1 - p - 1 ) #F检验值 r[j,i] =1 - pf(F,1,n1 - p - 1,ncp = 0,log = FALSE) #F检验得到的p值 } } r #对角线以上为偏相关系数,以下为其检验的p值 }

因篇幅问题不能全部显示,请点此查看更多更全内容