R语言学习之函数
R語言學習之函數
一、R函數
輸入數據類型:
向量:sum,mean,sd,range,median,sort,order
矩陣或數據框:cbind,rbind
數字矩陣:heatmap
R語言中常用lm()函數用于回歸分析
> state <- as.data.frame(state.x77[,c("Murder","Population","Illiteracy","Income","Frost")]) > fit<- lm (Murder ~ Population+Illiteracy+Income+Frost,data=state) > summary(fit)Call: lm(formula = Murder ~ Population + Illiteracy + Income + Frost, data = state)Residuals:Min 1Q Median 3Q Max -4.7960 -1.6495 -0.0811 1.4815 7.6210 Coefficients:Estimate Std. Error t value Pr(>|t|) (Intercept) 1.235e+00 3.866e+00 0.319 0.7510 Population 2.237e-04 9.052e-05 2.471 0.0173 * Illiteracy 4.143e+00 8.744e-01 4.738 2.19e-05 *** Income 6.442e-05 6.837e-04 0.094 0.9253 Frost 5.813e-04 1.005e-02 0.058 0.9541 --- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1Residual standard error: 2.535 on 45 degrees of freedom Multiple R-squared: 0.567, Adjusted R-squared: 0.5285 F-statistic: 14.73 on 4 and 45DF, p-value: 9.133e-08二、選項參數
1、輸入控制部分
常用選項:
????file:接一個文件
????data:一般指要輸入一個數據框
????x:表示一個單獨的對象,一般是向量,也可以是矩陣或者列表
????formula:公式
????na.rm:刪除缺失值
????……
2、輸出控制部分
3、調節參數
-
根據名字判斷選項的作用
?? color:選項用來控制顏色
??select:與選擇有關
??font:與字體有關
??font.axis:坐標軸的字體
??lty:即line type
??lwd:即line width
??method:軟件算法
??……
-
選項接受那些參數
??main:字符串,不能是向量
??na.rm:TRUE或者FALSE
??axis:side參數只能是1到4
??fig:包含四個元素的向量
??……
三、數學統計函數
??d 概率密度函數
??p 分布函數
??q 分布函數的反函數
??r 產生相同分布的隨機數
正態分布函數:(mean代表均值,sd代表方差)
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)與離散分布相關的函數
與正態分布類似,在每種分布前加上d、p、q、r即可構成函數名稱
dhyper(x, m, n, k, log = FALSE) phyper(q, m, n, k, lower.tail = TRUE, log.p = FALSE) qhyper(p, m, n, k, lower.tail = TRUE, log.p = FALSE) rhyper(nn, m, n, k)runif(n) 函數用來生成n個0~1之間的隨機數
runif(50,min=1,max=100) 生成50個1到100的隨機數
set.seed(n) 在runif()前運行此函數可使n狀態與生成的隨機數綁定,會生成相同的隨機數
四、描述性統計函數
1、summary() 函數
> myvars <- mtcars[c("mpg", "hp", "wt", "am")] > summary(myvars)mpg hp wt am Min. :10.40 Min. : 52.0 Min. :1.513 Min. :0.0000 1st Qu.:15.43 1st Qu.: 96.5 1st Qu.:2.581 1st Qu.:0.0000 Median :19.20 Median :123.0 Median :3.325 Median :0.0000 Mean :20.09 Mean :146.7 Mean :3.217 Mean :0.4062 3rd Qu.:22.80 3rd Qu.:180.0 3rd Qu.:3.610 3rd Qu.:1.0000 Max. :33.90 Max. :335.0 Max. :5.424 Max. :1.00002、fivenum(),與summary()函數類似,返回最小值,四分位值,中位數,上四分位數和最大值
> fivenum(myvars$hp) [1] 52 96 123 180 3353、Hmisc包中的describe函數:
describe(mycars)4、pastecs包中stat.desc函數:計算種類繁多的描述性統計量,其中x是一個數據框或時間序列
stat.desc(mycars)5、psych包中describe函數:
describe(mycars) describe(mycars,trim=0.1) #trim=0.1去掉10%的最低值最高值部分6、aggregate()函數
很多情況下,我們需要對數據進行分組描述,這時候可以使用aggregate函數,aggregate函數能夠對數據按照指定的分組信息進行統計,將分組信息通過一個列表指定出來:
aggregate函數的缺點是一次只能計算一個統計函數。
7、使用doBy包中的summaryBy函數:
summaryBy(mpg+hp+wt~am,data=mycars,FUN=mean)8、使用psych包中的describeBy函數:
describeBy(mycars,list(am=mycars$am))五、頻數統計函數
1、一維頻數統計
- tabel()函數
分組后可以使用tabel()函數進行頻數統計,計算頻數表,也稱為列聯表,有一維列聯表和多維列聯表。
> split(mtcars,mtcars$cyl) > split(mtcars,as.factor (mtcars$cyl)) #根據cul進行分類 > num <- 1:100 > cut(num,c(seq(0,100,10))) > cut(mtcars$mpg,c(seq(10,50,10))) #頻數統計 > table(mtcars$cyl)4 6 8 11 7 14 > table(cut(mtcars$mpg,c(seq(10,50,10)))) (10,20] (20,30] (30,40] (40,50] 18 10 4 0- prop.table()函數直接計算頻數
2、二維數據框
library(vcd) table(Arthritis$Treatment,Arthritis$Improved) #統計兩個量的頻數,返回的結果是一個二維的列聯表若變量太多,可提前使用with或xtabs加載數據
with(data = Arthritis,{table(Treatment,Improved)}) xtabs(~Treatment+Improved,data = Arthritis)3、邊際頻數統計
邊際頻數統計即按著行和列進行統計
> library("grid") > library("vcd") > mytable <- table(Arthritis$Treatment,Arthritis$Improved) > with(data = Arthritis,{table(Treatment,Improved)})Improved Treatment None Some MarkedPlacebo 29 7 7Treated 13 7 21 > mytable <- xtabs(~ Treatment+Improved, data=Arthritis) > mytable # frequenciesImproved Treatment None Some MarkedPlacebo 29 7 7Treated 13 7 21 > margin.table(mytable,1) #1代表按行進行邊際頻數統計 Treatment Placebo Treated 43 41 > margin.table(mytable, 2) #2代表按列進行邊際頻數統計 ImprovedNone Some Marked 42 14 28將邊際頻數的和添加到頻數表中:
addmargins(x) addmargins(x,1) addmargins(x,2)三維列聯表
> mytable <- xtabs(~ Treatment+Sex+Improved, data=Arthritis) > mytable , , Improved = NoneSex Treatment Female MalePlacebo 19 10Treated 6 7, , Improved = SomeSex Treatment Female MalePlacebo 7 0Treated 5 2, , Improved = MarkedSex Treatment Female MalePlacebo 6 1Treated 16 5> ftable(mytable) Improved None Some Marked Treatment Sex Placebo Female 19 7 6Male 10 0 1 Treated Female 6 5 16Male 7 2 5六、獨立性檢驗函數
1、獨立性檢驗函數
? 獨立性檢驗是根據頻數信息判斷兩類因子彼此相關或相互獨立的假設檢驗。所謂獨立性就是指變量之間是獨立的,沒有關系。
? 獨立性檢驗算法:卡方檢驗、Fisher檢驗、Cochran-Mantel-Haenszel檢驗
2、假設檢驗
? 假設檢驗(Hypothesis Testing)是數理統計學中根據一定假設條件由樣本推斷總體的一種方法。
? 原假設——沒有發生
? 備擇假設——發生了
? 具體做法:根據問題的需要對所研究的總體作某種假設,記作H0;選取合適的統計量,這個統計量的選取要使得在假設H0成立時,其分布為已知;由實測的樣本,計算出統計量的值,并根據預先給定的顯著性水平進行檢驗,做出拒接或接受假設H0的判斷。
3、p-value
p-value就是Probability的值,它是一個通過計算得到的概率值,也就是在原假設為真時,得到最大的或者超出所得到的檢驗統計量值的概率。
一般將p值定位到0.05,當p<0.05時拒絕原假設,p>0.05時,不拒絕原假設。
4、卡方檢驗
> library(vcd) > mytable <- table(Arthritis$Treatment,Arthritis$Improved) > chisq.test(mytable)Pearson's Chi-squared testdata: mytable X-squared = 13.055, df = 2, p-value = 0.001463? 上述p-value = 0.001463<0.05,說明Treatment和Improved這兩個變量不是獨立的。
5、Fisher檢驗
Fisher精確檢驗的原理是邊際固定的列聯表中行和列是相互獨立的。
> mytable <- xtabs(~Treatment+Improved, data=Arthritis) > fisher.test(mytable)Fisher's Exact Test for Count Datadata: mytable p-value = 0.001393 alternative hypothesis: two.sidedp值小于0.05,說明不獨立
6、Cochran-Mantel-Haenszel檢驗
? 原理是兩個名義變量在第三個變量每一個水平中都是條件獨立的。根據定義這個檢驗需要三個變量。
> mytable <- xtabs(~Treatment+Improved+Sex, data=Arthritis) > mantelhaen.test(mytable)Cochran-Mantel-Haenszel testdata: mytable Cochran-Mantel-Haenszel M^2 = 14.632, df = 2, p-value = 0.0006647? 結果得到的p-value值非常小,說明藥物治療和改善情況在性別的每一個水平上不獨立。如果調整變量的順序,結果是有差別的,這里函數中的變量順序很重要。
七、相關性分析函數
1、相關性分析
? 相關性分析是指對兩個或多個具備相關性的變量元素進行分析,從而衡量兩個變量因素的相關密切程度。相關性的元素之間需要存在一定的聯系或者概率才可以進行相關性分析。簡單來說就是變量之間是否有關系。
? 相關性可能是正相關,也可能是負相關,需要根據相關系數決定。相關系數的大小表示相關程度的強弱。
2、相關性衡量指標
? 相關系數有多種計算方法,包括Pearson相關系數、Spearman相關系數、Kendall相關系數、偏相關系數、多分格(polychoric)相關系數和多系列(polyserial)相關系數。
? 和獨立性檢驗不同,相關性當中每種方法都沒有獨立的函數,這里計算相關系數都使用同一個函數cor。cor函數可以計算三種相關系數:pearson、kendall、spearman。具體使用哪種方法,可以通過函數中的method參數指定。函數中的use參數表示如何處理缺失值,是不處理還是刪除等等。
3、實例
本次實例利用state.x77數據集作為演示
-
state.x77
? state.x77數據集是美國50個州在1977年的人口收入、文盲率、預期壽命及謀殺率等指標的統計。數據類型為矩陣。本次實例在于統計謀殺率和哪些指標有關。
-
cor(state.x77)計算相關系數
一般相關系數都在0到1之間,0最小,1最大,正負號代表是正相關還是負相關
-
cov(state.x77)計算協方差,用來衡量兩個變量的總體誤差
-
如果只想計算一組變量與另一組變量之間的關系,而不需要將變量兩兩求相關系數
#x <- states[,c("Population", "Income", "Illiteracy", "HS Grad")] x <- state.x77[,c(1,2,3,6)] #y <- states[,c("Life Exp", "Murder")] y <- state.x77[,c(4,5)] > cor(x,y) > head(x)Population Income Illiteracy HS Grad Alabama 3615 3624 2.1 41.3 Alaska 365 6315 1.5 66.7 Arizona 2212 4530 1.8 58.1 Arkansas 2110 3378 1.9 39.9 California 21198 5114 1.1 62.6 Colorado 2541 4884 0.7 63.9 > head(y)Life Exp Murder Alabama 69.05 15.1 Alaska 69.31 11.3 Arizona 70.55 7.8 Arkansas 70.66 10.1 California 71.71 10.3 Colorado 72.06 6.8> cor(x,y)Life Exp Murder Population -0.06805195 0.3436428 Income 0.34025534 -0.2300776 Illiteracy -0.58847793 0.7029752 HS Grad 0.58221620 -0.4879710
? 描述相關性的其他指標,例如偏相關系數、多分格相關系數和多系列相關系數等等,可以通過R的擴展包來實現。
? ggm包中的pcor可以用來計算偏相關系數。偏相關是指在控制一個或多個變量時,剩余其他變量之間的相互關系。
install.packages("ggm") library(ggm) colnames(state.x77) pcor(c(1,5,2,3,6), cov(state.x77))? pcor(u,s) 函數中u是一個向量,向量中的前兩個值是要計算的相關系數的下標,其余數值為條件變量的下標;s是cov函數計算出來的協方差結果。
八、相關性檢驗函數
cor.test(x,y,alternative,method)
- x,y表示向量
- alternative指定單側檢驗還是雙側檢驗,two.sided同時檢驗正負相關,greater檢驗正相關,less檢驗負相關;
- method指定使用哪種相關性衡量指標(pearson、kendall還是spearman)
計算state.x77中謀殺率與文盲率之間的相關性:
cor.test(state.x77[,3],state.x77[,5]) > cor.test(state.x77[,3],state.x77[,5])Pearson's product-moment correlationdata: state.x77[, 3] and state.x77[, 5] t = 6.8479, df = 48, p-value = 1.258e-08 alternative hypothesis: true correlation is not equal to 0 95 percent confidence interval:0.5279280 0.8207295 sample estimates:cor 0.7029752? p-value值遠小于0.05,說明謀殺率與文盲率相關,此外還給出了相關系數為0.7029752,置信區間為0.5279280~0.8207295。
? 置信區間:confidence interval,是指樣本統計量所構造的總體參數的估計區間。在統計學中,一個概率樣本的置信區間是對這個樣本的某個總體參數的區間估計。置信區間展現的是這個參數的真實值有一定概率落在測量結果的周圍的程度。置信區間給出的是被測量參數的測量值的可信程度。
cor.test()每次只能檢測一組變量,使用起來較為麻煩,
-
psych包中的corr.test函數:可以一次性檢驗多個變量之間的相關性。
library(psych) corr.test(state.x77) -
ggm包中的pcor.test函數:檢驗偏相關性。
pcor.test(x,q,n)
- x是pcor計算的偏相關系數;
- q是要控制的變量數;
- n是樣本數。 -
分組數據的相關性檢驗
? t檢驗:即student’s t-test,t檢驗是用t分布理論推論差異發生的概率,從而比較兩個平均數的差異是否顯著。主要用于樣本含量較小,一般小于30個,總體標準差未知的正態分布數據。
? 在這里使用MASS包的UScrime數據集,UScrime數據集包含1960年美國47個州的刑罰制度對犯罪率的信息
t.test(y~x,data=UScrime)
- y是一個數值型變量,x是一個二分型變量
? 結果中p-value = 0.0006506,小于0.05,可以拒絕南方各州與非南方各州擁有相同監禁概率的假設。
? 如果想在多于兩個組之間進行比較,若數據滿足正態分布,可以使用方差分析;若不滿足正態分布,則需要使用非參數檢驗方法。
? 非參數檢驗稱為nonparametric tests,在總體方差未知或知道甚少的情況下,利用樣本數據對總體分布形態等進行推斷的方法。由于非參數檢驗方法在推斷過程中不涉及有關總體分布的參數,因而得名為“非參數”檢驗。
? 參數檢驗稱為parametric tests,是在總體分布形式已知的情況下,對總體分布的參數如均值、方差等進行推斷的方法。也就是數據分布已知,比如滿足正態分布。
九、繪圖函數
1、R語言四大作圖系統
- 基礎繪圖系統(graphics包,默認已加載)
- lattice包
- ggplot2包
- grid包
2、R基礎繪圖系統
1)高級繪圖
高級繪圖是一步到位,可以直接繪制出圖;
2)低級繪圖
低級繪圖不能單獨使用,必須在高級繪圖產生圖形的基礎上,對圖形進行調整,比如加一條線,加上標題文字等。
3、R繪圖輸入數據
對于繪圖函數,最重要的就是要知道輸入數據的格式。
- 散點圖:x和y兩個坐標數據;
- 直方圖:因子;
- 熱力圖:數據矩陣;
……
4、plot函數
plot(women$height,women$weight) #輸入是向量,輸出是散點圖 plot(as.factor(mtcars$cyl)) #輸入是因子,輸出是直方圖 plot(as.factor(mtcars$cyl),mtcars$carb) #輸入是第一個參數是因子,第二個參數是向量,輸出是箱線圖 plot(mtcars$carb,as.factor(mtcars$cyl)) #輸入是第一個參數是向量,第二個參數是因子,輸出是散點圖 plot(women$height~women$weight) #輸出的是二者的關系散點圖利用plot函數直接繪制線性回歸的結果:
fit <- lm(height~weight,data=women) #lm函數是用于擬合線性模型 plot(fit) #結果生成四幅圖? plot函數之所以支持多種輸入數據格式,原因在于其支持多種屬性的數據格式。使用methods(plot)運行后可以看出,plot其實是一個大家族,里面有很多子函數,每個子函數名后綴對應這種屬性的數據。print和summary也是這樣的道理。
5、par函數
par是用來對繪圖參數進行設置的。如:
plot(as.factor(mtcars$cyl),col=c(“red”,“green”,“blue”)) #給圖形上色直接在R編輯器中輸入命令par()或者par(no.readonly=TRUE)都可以獲取當前的各個繪圖參數。
十、自定義函數
在R中只寫函數名,不加括號,就會給出函數的源代碼,以cor()為例
有些函數代碼被封裝,敲函數名無法顯示源代碼,例如sum,mean
函數包含以下四部分:
1、函數名稱
-
函數命令與功能相關
-
名稱可以是子母和數字的組合,但必須是字母開頭
2、函數聲明
-
利用function函數來聲明
myfun <- function(選項參數){函數體 }
3、函數參數
4、函數體
以計算偏度與峰度函數為例
? 偏度(skewness),是統計數據分布偏斜方向和程度的度量,是統計數據分布非對稱程度的數字特征。
? 峰度(peakedness;kurtosis)又稱峰態系數。表征概率密度分布曲線在平均值處峰值高地的特征數。
mystats <- function(x,na.omit=FALSE) { #na.omit用于刪除缺失值。默認維FALSEif(na.omit) x <- x[!is.na(x)]m <- mean(x)n <- length(x)s <- sd(x)skew <- sum((x-m^3/s^3))/nkurt <- sum((x-m^4/s^4))/n-3return(c(n=n,mean=m,stdev=s,skew=skew,kurtosis=kurt))}R語言中的循環與向量化操作
函數內部通過循環實現向量化操作
- if 條件判斷
- for 循環
- while 循環
-
switch 語句
……
循環三部分
1)條件判斷,是真或是假
2)用于循環執行的結構
3)表達式
switch語句
switch(expr, list)
其中,expr為表達式,其值或為一個整數值或為一個字符串;list為一個列表。
若expr的計算結果為整數,且值在1~length(list)之間時,則switch()函數返回列表相應位置的值。若expr的值超出范圍,則沒有返回值
#switch語句 x <- 2 switch(x, "C", "Python", "R")由上例可知,x的值為2,則switch函數根據傳入的值2,輸出列表中的第2個值:“Python”。
我們可以使用switch函數的這一性質可以定義一個函數實現多種操作:
centre <- function(x, type) {switch(type,mean = mean(x),median = median(x),trimmed = mean(x, trim = .1)) }x <- rcauchy(10) centre(x, "mean") centre(x, "median") centre(x, "trimmed")i=1;while(i <= 10) {print (“Hello,World”);i=i+2;}
- switch 語句……**循環三部分**1)條件判斷,是真或是假2)用于循環執行的結構3)表達式**switch語句**switch(expr, list)其中,expr為表達式,其值或為一個整數值或為一個字符串;list為一個列表。若expr的計算結果為整數,且值在1~length(list)之間時,則switch()函數返回列表相應位置的值。若expr的值超出范圍,則沒有返回值```R #switch語句 x <- 2 switch(x, "C", "Python", "R")由上例可知,x的值為2,則switch函數根據傳入的值2,輸出列表中的第2個值:“Python”。
我們可以使用switch函數的這一性質可以定義一個函數實現多種操作:
centre <- function(x, type) {switch(type,mean = mean(x),median = median(x),trimmed = mean(x, trim = .1)) }x <- rcauchy(10) centre(x, "mean") centre(x, "median") centre(x, "trimmed")總結
- 上一篇: 泛微OA 任意文件上传漏洞
- 下一篇: [每周一读]——不让时间偷走你的成功