R軟件學習筆記-4(描述統計)

###################################計算基本描述統計量
##讀取學生成績數據
ReportCard<-read.table(file="ReportCard.txt",header=TRUE,sep=" ")

fix(ReportCard)


attach是將數據添加上內存中,一般用於數據框,添加之後就可以直接提取數據框的,否則用 $ 訪問 ,但是一般用完都會detach()刪除掉。

##計算政治課程的描述統計量A
attach(ReportCard)
(Av.Poli<-mean(poli))                                            ##  Av.Poli是個整體,Av表示求均值,Sd表示求方差,Sum表示求和,只是一種命名方式
(Av.Poli<-mean(poli,na.rm=TRUE))                   ##  na.rm是個邏輯變量,表示是否去除空值
(Sd.Poli<-sd(poli,na.rm=TRUE))
(N<-length(poli[!is.na(poli)]))
(Skew.Poli<-sum((poli[!is.na(poli)]-Av.Poli)^3/Sd.Poli^3)/N)
(Kurt.Poli<-sum((poli[!is.na(poli)]-Av.Poli)^4/Sd.Poli^4)/N-3)
 summary(poli)
detach(ReportCard)


###############利用Contrib包計算描述統計量
install.packages("psych")
library("psych")

> describe(ReportCard$poli)
  vars  n  mean    sd median trimmed  mad min max range  skew kurtosis   se
1    1 58 79.64 10.58   82.5   80.81 8.15  40  96    56 -1.31     2.05 1.39


關於apply的相關函數參見:

R中利用apply、tapply、lapply、sapply、mapply、table等函數進行分組統計

(Av.Course<-sapply(ReportCard[,3:10],FUN=mean,na.rm=TRUE))
(Sd.Course<-sapply(ReportCard[,3:10],FUN=sd,na.rm=TRUE))

也可以採用行列函數處理:

Av.Course<-colMeans(ReportCard[,3:10],na.rm=TRUE)      ##均值
Sum.Course<-colSums(ReportCard[,3:10],na.rm=TRUE)  ##計算總和

相關函數還有:

colSums (x, na.rm = FALSE, dims = 1)
rowSums (x, na.rm = FALSE, dims = 1)
colMeans(x, na.rm = FALSE, dims = 1)
rowMeans(x, na.rm = FALSE, dims = 1)

也可以自定義函數實現自己需要的功能:

#########方便地計算每門課程的描述統計量(用戶自定義函數的定義和調用)
Des.Fun<-function(x,...){
 Av<-mean(x,na.rm=TRUE)
 Sd<-sd(x,na.rm=TRUE)
 N<-length(x[!is.na(x)])
 Sk<-sum((x[!is.na(x)]-Av)^3/Sd^3)/N
 Ku<-sum((x[!is.na(x)]-Av)^4/Sd^4)/N-3
 result<-list(avg=Av,sd=Sd,skew=Sk,kurt=Ku)
 return(result)
}

DesRep<-sapply(ReportCard[,3:10],FUN=Des.Fun,na.rm=TRUE)       ##調用Des.Fun函數,x 賦值爲ReportCard[,3:10],空值去掉。


subset函數

利用subset()函數進行訪問和選取數據框的數據更爲靈活,subset函數將滿足條件的向量、矩陣和數據框按子集的方式返回。

Subset函數的三種應用方式:

subset(x,subset, ...)                     

subset(x,subset, select, drop = FALSE, ...)    ##對於矩陣

subset(x,subset, select, drop = FALSE, ...)    ##對於數據框

x是對象,subset是保留元素或者行列的邏輯表達式,對於缺失值用NA代替。

Select 是選取的範圍,應小於x
>x<-data.frame(matrix(1:30,nrow=5,byrow=T))

>rownames(x)=c("one","two","three","four","five")

>colnames(x)=c("a","b","c","d","e","f")

>x

>new<-subset(x,a>=14,select=a:f)

>new                            ## af列選取a>14的行。


##分性別計算各門課程的描述統計量
MaleCard<-subset(ReportCard,ReportCard$sex=="M")
(Des.Male<-sapply(MaleCard[3:10],FUN=Des.Fun,na.rm=TRUE))
FeMaleCard<-subset(ReportCard,ReportCard$sex=="F")
(Des.FeMale<-sapply(FeMaleCard[3:10],FUN=Des.Fun,na.rm=TRUE))

Des.Sex<-cbind(Des.Male,Des.FeMale)

cor相關係數

##################計算相關係數
Tmp<-ReportCard[complete.cases(ReportCard),]
(CorMatrix<-cor(Tmp[,c(5,7,8)],use="everything",method="pearson"))
(CovMatrix<-cov(Tmp[,c(5,7,8)],use="complete.obs",method="pearson"))
rm(Tmp)

cor.test(X,Y,method="")
method可以爲"spearman","pearson" and "kendall",分別對應三種相關係數的計算和檢驗。
1 perrson相關係數
> n <- 10
> x <- rnorm(n)
> y <- rnorm(n)
> cor(x,y)
[1] -0.4132864
> cor.test(x,y)
      Pearson's product-moment correlation
data:  x and y
t = -1.2837, df = 8, p-value = 0.2352
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.8275666  0.2924366
sample estimates:
       cor
-0.4132864
上面給出了相關係數的可信度區間和P-value


今天查了一下R語言中set.seed(),該命令的作用是設定生成隨機數的種子,種子是爲了讓結果具有重複性。如果不設定種子,生成的隨機數無法重現。

正態分佈

###############正態分佈
set.seed(12345)
x<-rnorm(1000,0,1)
Ord<-order(x,decreasing=FALSE)
x<-x[Ord]
y<-dnorm(x,0,1)
plot(x,y,type="l",ylab="密度",main="標準正態分佈與不同自由度下的t分佈密度函數",lwd=1.5)

norm是正態分佈,前面加r表示生成隨機正態分佈的序列,其中rnorm(10)表示隨機產生10個數;給定正太分佈的均值和方差,pnorm可以輸出正態分佈的分佈函數,dnorm可以輸出正態分佈的概率密度函數,qnorm給定分爲數正太分佈

簡單的說:dnorm是密度函數,pnorm是分佈函數,qnorm是分位函數,rnorm是產生隨機數,

dnorm(x,mean = 0, sd = 1, log = FALSE)

pnorm(q,mean = 0, sd = 1, lower.tail = TRUE, log.p = FALSE)

qnorm(p,mean = 0, sd = 1, lower.tail = TRUE, log.p = FALSE)

rnorm(n, mean = 0, sd = 1)

T分佈

dnorm是正態分佈密度函數,dt是t分佈密度函數:

lc<-2
for(i in c(5,20,30)){
 x<-rt(1000,i)
 Ord<-order(x,decreasing=FALSE)
 x<-x[Ord]
 y<-dt(x,i)
 lines(x,y,lty=lc)
 lc<-lc+1
}
legend("topright",title="自由度",c("標準正態分佈","5個","20個","30個"),lty=c(1,2,3,4))


卡方分佈:

##############卡方分佈
set.seed(12345)
x<-rnorm(1000,0,1)
Ord<-order(x,decreasing=FALSE)
x<-x[Ord]
y<-dnorm(x,0,1)
plot(x,y,xlim=c(-1,35),type="l",ylab="密度",main="標準正態分佈與不同自由度下的卡方分佈密度函數",lwd=1.5)
#######不同自由度的卡方分佈
df<-c(1,5,8,15)
for(i in 1:4){
 x<-rchisq(1000,df[i])
 Ord<-order(x,decreasing=FALSE)
 x<-x[Ord]
 y<-dchisq(x,df[i])
 lines(x,y,lty=i+1)
}
legend("topright",title="自由度",c("標準正態分佈",df),lty=c(1,2,3,4,5))

################卡方檢驗
Tmp<-ReportCard[complete.cases(ReportCard),]
(CrossTable<-table(Tmp[,c(2,12)]))
(ResChisq<-chisq.test(CrossTable,correct=FALSE))
ResChisq$expected

發佈了18 篇原創文章 · 獲贊 43 · 訪問量 21萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章