##讀取學生成績數據
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 ## 從a到f列選取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分佈
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