R語言描述統(tǒng)計與假設檢驗

如何計算描述統(tǒng)計量

1. summary()函數(shù)能颁。

最基本的就是summary函數(shù)杂瘸。可以輸出 最小值劲装,最大值胧沫,四分位數(shù),數(shù)值型變量的均值占业,以及因子向量和邏輯型向量的頻數(shù)統(tǒng)計绒怨。
以下用mtcars數(shù)據(jù)集來舉例

head(mtcars)
str(mtcars)
myvars <- c("mpg", "hp", "wt")
summary(mtcars[myvars])

2. sapply()函數(shù)。

使用sapply函數(shù)調用任意函數(shù)來實現(xiàn)谦疾。
使用方法:sapply(x, FUN, options)
定義一個mystats函數(shù)南蹂,后通過sapply調用。

mystats <- function(x, na.omit=FALSE){
  if (na.omit) 
    x <- x[!is.na(x)] #去掉缺失值
  m <- mean(x) #均值
  n <- length(x) #個數(shù)
  s <- sd(x) #標準差
  skew <- sum((x-m)^3/s^3)/n #偏度
  kurt <- sum((x-m)^4/s^4)/n - 3 #峰度
  return(c(n=n, mean=m, stdev=s, skew=skew, kurtosis=kurt)) #返回值
}
#通過sapply來調用自己定義好的函數(shù)mystats
sapply(mtcars[myvars], mystats)

3. pastecs包中的stat.desc()函數(shù)念恍。推薦使用這個六剥。

stat.desc()這個函數(shù)是比較好用的計算描述統(tǒng)計量的函數(shù),可以輸出的結果比較多峰伙。
用法:stat.desc(x, basic=TRUE, desc=TRUE, norm=FALSE, p=0.95)
basic=TRUE疗疟,計算的基礎指標包括:數(shù)據(jù)個數(shù)(nbr.val)、空值的個數(shù)(nbr.null)瞳氓、缺失值的個數(shù)(nbr.na)策彤、最小值(Min)、最大值(Max)匣摘、值域(range店诗,即max-min)、所有非缺失值的總和(Sum)
desc=TRUE音榜,計算:中位數(shù)(median)庞瘸、平均數(shù)平均數(shù)(Mean)、平均數(shù)的標準誤(SE.Mean)赠叼、平均數(shù)置信度為95%的置信區(qū)間(CI.Mean)擦囊、方差(Var)、標準差(std.dev)和變異系數(shù)(coef.var,其定義為標準差除以平均數(shù))嘴办。
平均值置信度(95%)指的是在95%的置信度下計算出的平均值的允許誤差,可以用平均值+或-這個數(shù)來計算置信區(qū)間的上限和下限.
norm=TRUE霜第,計算偏度和峰度(以及他們的統(tǒng)計顯著程度),s-w正態(tài)檢驗的結果户辞。偏度系數(shù)skewness,其顯著性判別依據(jù)(如果skew.2SE>1泌类,則偏度顯著不等于零)、峰度系數(shù)kurtosis、其顯著性依據(jù)(與skew.2SE相同)刃榨、正態(tài)性的Shapiro-Wilk檢驗(Normaltest.W)及其概率(normtest.p)

install.packages("pastecs")
library(pastecs)
stat.desc(mtcars[myvars],basic=TRUE, desc=TRUE, norm=TRUE, p=0.95)

如何分組計算描述統(tǒng)計量

  1. aggregate()函數(shù)弹砚。
    使用這個函數(shù),可以計算平均數(shù)枢希、標準差等返回值桌吃。但是每次只能計算一種。
data <-aggregate(df$decision.RESP, by=list(Subject=df$Subject,Intention=df$intention,Outcome=df$outcome), FUN=mean, na.rm=TRUE)
aggregate(mtcars[myvars], by=list(am=mtcars$am), mean)
aggregate(mtcars[myvars], by=list(am=mtcars$am), sd)

doBy包中的summaryBy()函數(shù) 推薦使用這個苞轿。和stat.desc搭配使用茅诱。

可以同時返回若干個統(tǒng)計量。
用法:summaryBy(formula, data=dataframe, FUN=function)
formula的格式:var1 + var2 + var3 + ... + varN ~ groupvar1 + groupvar2 + ... + groupvarN
~左側的變量是需要分析的數(shù)值型變量搬卒,右側的變量是類別型的分組變量瑟俭。

function可以是任何內建或者用戶自編的R函數(shù)。

install.packages("doBy")
library(doBy)
# 根據(jù)am的不同水平來 分別計算 am不同水平下 mpg hp wt的描述統(tǒng)計值契邀。調用的函數(shù)是stat.desc摆寄。
# 這樣可以輸出stat.desc()函數(shù)的很多描述統(tǒng)計值。
summaryBy(mpg+hp+wt~am, data=mtcars, FUN=stat.desc)

直方圖

par(mfrow=c(2,2)) # 畫4幅圖

par(mfrow=c(1,2))實現(xiàn)一頁多圖的功能
其中坯门,通過設定函數(shù)par()的各個參數(shù)來調整我們的圖形
mfrow=c(2,2) 就是畫4幅圖微饥,
mfrow=c(3,5),是畫15幅圖,
例如 par(mfrow=c(2,3)) 一個圖版顯示2行古戴,3列
作者:巴拉巴拉_9515
鏈接:http://www.reibang.com/p/e5f86fd8d033
來源:簡書
著作權歸作者所有欠橘。商業(yè)轉載請聯(lián)系作者獲得授權,非商業(yè)轉載請注明出處现恼。

hist(mtcars$mpg)

hist(mtcars$mpg, 
     breaks=12,# 指定組的數(shù)量简软,也就是直方圖中柱形的數(shù)量。
     # col="red", # 指定顏色
     xlab="Miles Per Gallon", #指定x軸的標題
     main="Colored histogram with 12 bins") #指定圖形的標題

hist(mtcars$mpg,
     freq=FALSE, # 根據(jù)概率密度而不是頻數(shù)繪制圖形
     breaks=12,
     # col="red",
     xlab="Miles Per Gallon",
     main="Histogram, rug plot, density curve")
rug(jitter(mtcars$mpg,amount=0.01)) 
#軸須圖(rug plot):實際數(shù)據(jù)值的一種一維呈現(xiàn)方式述暂。
# jitter 將向每個數(shù)據(jù)點添加一個小的隨機值(一個±amount之間的均勻分布隨機數(shù)),以避免重疊的點產生影響建炫。
lines(density(mtcars$mpg), col="blue", lwd=2) # 添加一條藍色畦韭、寬度2的 密度曲線。

x <- mtcars$mpg 
h<-hist(x, 
        breaks=12,
        # col="red",
        xlab="Miles Per Gallon",
        main="Histogram with normal curve and box") 
xfit<-seq(min(x), max(x), length=40) 
# dnorm是密度函數(shù)肛跌,也就是正態(tài)分布曲線函數(shù) 
# dnorm(x, mean = 0, sd = 1, log = FALSE)
yfit<-dnorm(xfit, mean=mean(x), sd=sd(x))
# h$mids[1:2] 含義是 h這一個list里面的mids變量的第一個和第二個數(shù)據(jù)艺配,這里表示的是,橫坐標每個柱形的中間點的坐標衍慎。
# diff(h$mids[1:2]) 第一個和第二個坐標的差值
yfit <- yfit*diff(h$mids[1:2])*length(x) 
lines(xfit, yfit, col="blue", lwd=2)
box() #將圖形圍繞起來的盒型

h[["mids"]]

箱線圖

用法:boxplot(formula, data=dataframe)

par(mfrow=c(1,1))
boxplot(mtcars$mpg, main="Box plot", ylab="Miles per Gallon")
a<-boxplot.stats(mtcars$mpg)

a[["stats"]] 畫圖所需的數(shù)據(jù):最小值转唉、下四分位、中位數(shù)稳捆、上四分位赠法、最大值。
a[["n"]] 數(shù)據(jù)的個數(shù)
a[["out"]] 離群點乔夯,是 范圍±1.5IQR以外的值砖织。IQR表示四分位距款侵,即上四分位數(shù)與下四分位數(shù)的差值。
默認情況下侧纯,箱線圖兩條須的延伸極限不會超過 盒型各端±1.5
IQR的范圍新锈。

boxplot(mpg~cyl, #y~a,將為類別型變量a的每個水平并列的生成數(shù)值型變量y的箱線圖眶熬。
        # 如果有兩個變量妹笆,則寫為 y~a*b 表示為變量a和b所有水平的兩兩組合生成數(shù)值型變量y的箱線圖。
        data=mtcars,
        main="Car Mileage Data",
        xlab="Number of Cylinders",
        ylab="Miles Per Gallon")

mtcars[c("cyl","am")]<-lapply(mtcars[c("cyl","am")],as.factor)
boxplot(mpg~cyl*am,
        data=mtcars,
        main="Car Mileage Data",
        xlab="Number of Cylinders",
        ylab="Miles Per Gallon")

boxplot(mpg~am*cyl,
        # 畫圖的順序是娜氏,cyl的一個水平上拳缠,am的兩個水平都畫完。在畫cyl的下一個水平
        data=mtcars,
        col=c("gold","darkgreen"),
        main="MPG Distribution by Auto Type",
        xlab="Auto Type",
        ylab="Miles Per Gallon")

小提琴圖

是箱線圖和核密度圖的結合體牍白。
用法:vioplot(x1, x2, ... , names=, col=)

install.packages("vioplot")
library(vioplot)
x1 <- mtcars$mpg[mtcars$cyl==4]
x2 <- mtcars$mpg[mtcars$cyl==6]
x3 <- mtcars$mpg[mtcars$cyl==8]
vioplot(x1, x2, x3,
        names=c("4 cyl", "6 cyl", "8 cyl"),
        col="gold")
# 圖形中白點是中位數(shù)脊凰,黑色盒型的范圍是上下四分位點,細黑線表示須茂腥。外部形狀即為核密度估計狸涌。
title("Violin Plots of Miles Per Gallon", 
      ylab="Miles Per Gallon",
      xlab="Number of Cylinders")

點圖

用法:dotchart(x, labels=)

dotchart(mtcars$mpg,
         labels=row.names(mtcars),# labels是由每個點的標簽組成的向量
         cex=.7, # 指定標簽的大小,包括labels最岗,main和xlab
         main="Gas Mileage for Car Models",
         xlab="Miles Per Gallon")

x <- mtcars[order(mtcars$mpg),]
x$cyl <- factor(x$cyl)
x$color[x$cyl==4] <- "red"
x$color[x$cyl==6] <- "blue"
x$color[x$cyl==8] <- "darkgreen"
dotchart(x$mpg, 
         labels = row.names(x), 
         cex=.7, 
         groups = x$cyl,# 通過groups來選定一個因子帕胆,用以指定x中元素的分組方式。
         gcolor = "black",# 控制不同組 標簽的顏色般渡。這里是指 4 6 8三個數(shù)字的顏色懒豹。
         color = x$color,# 點和標簽的顏色來自向量color
         pch=19, #在R語言中,點的樣式由pch的取值決定驯用。 
         main = "Gas Mileage for Car Models\ngrouped by cylinder", 
         xlab = "Miles Per Gallon")

頻數(shù)表和列聯(lián)表

install.packages("vcd")
library(vcd)
head(Arthritis)

table()

table()函數(shù)默認忽略缺失值
使用N個類別型變量(因子)創(chuàng)建一個N維列聯(lián)表
用法:table(var1, var2, ..., varN)

一維列聯(lián)表

mytable<-table(Arthritis$Improved) 
mytable
mytable <- with(Arthritis,
                table(Improved)
                )
mytable

prop.table()將頻數(shù)轉化為比例

prop.table(mytable) #prop.table()將頻數(shù)轉化為比例
prop.table(mytable)*100 #prop.table()將頻數(shù)轉化為比例脸秽,之后乘以100,變成百分比

二維列聯(lián)表

mytable <- table(A, B)
A是行變量蝴乔,B是列變量

mytable<-table(Arthritis$Improved,Arthritis$Treatment) 
x<-prop.table(mytable) 
# 不加數(shù)字的話记餐,分母是 Improved和Treatment加起來的總人數(shù)。
# 得到的所有比例數(shù)字加起來等于1薇正。也就是sum(x)等于1
x<-prop.table(mytable,1) 
# 1表示根據(jù)table()語句中的第1個變量(這里指Arthritis$Improved)來計算比例:
# 分別計算 Improved的三個水平的比例片酝,分母是 Improved的三個水平的總數(shù)。
# 每一行的比例加起來等于1挖腰。apply(x,1,sum)等于1,1,1
x<-prop.table(mytable,2) 
# 2表示根據(jù)table()語句中的第2個變量(這里指Arthritis$Treatment)來計算比例:
# 分別計算 Treatment的兩個水平的比例雕沿,分母是 Treatment 的兩個水平的總數(shù)。
# 每一列的比例加起來等于1猴仑。apply(x,2,sum)等于1,1

mytable <- xtabs(~ A + B, data=mydata)

A是行變量审轮,B是列變量

mytable <- xtabs(~ Treatment+Improved, data=Arthritis)
mytable

margin.table 生成頻數(shù)

margin.table(mytable, 1)
# 1表示根據(jù)table()語句中的第1個變量(這里指Arthritis$Treatment)來計算頻數(shù)
# 也就是計算 Treatment 的兩個水平各自的頻數(shù)。
margin.table(mytable, 2)
# 1表示根據(jù) table()語句中的第2個變量(這里指Arthritis$Improved)來計算頻數(shù)
# 也就是計算 Improved 的三個水平各自的頻數(shù)。
margin.table(mytable)
# 不加數(shù)字的話断国,計算得到的是總人數(shù)贤姆。

addmargins()

addmargins(mytable) # 添加每行和每列的和
addmargins(mytable,1) # 添加每列的和
addmargins(mytable,2) # 添加每行的和
addmargins(prop.table(mytable,1),2)
addmargins(prop.table(mytable,2),1)

CrossTable() 生成二維列聯(lián)表 推薦使用這個∥瘸模可以生成多個參數(shù)霞捡。

install.packages("gmodels")
library(gmodels)
CrossTable(Arthritis$Treatment, Arthritis$Improved)
# 得到一個表格,包含數(shù)據(jù)總數(shù)薄疚、每種條件下的數(shù)據(jù)個數(shù)碧信、以及比例。
# 這里比例包括 三種街夭,分母分別是每一行的總數(shù)砰碴、每一列的總數(shù)、數(shù)據(jù)總數(shù)板丽。

多維列聯(lián)表

ftable()函數(shù)可以 以緊湊的方式輸出多維列聯(lián)表呈枉。推薦使用這個。

mytable <- xtabs(~ Treatment+Sex+Improved, data=Arthritis)
mytable
prop.table(mytable, c(1, 2))
# c(1,2)代表 Treatment 和 Sex埃碱,計算這兩個變量2*2比例的列聯(lián)表猖辫。
# 但是要根據(jù) Improved 的不同水平來分別計算。
ftable(prop.table(mytable, c(1, 2)))
ftable(addmargins(prop.table(mytable, c(1, 2)),1))
ftable(addmargins(prop.table(mytable, c(1, 2)),2))

相關系數(shù)和顯著性的計算

cor()函數(shù)用來計算相關系數(shù);

用法:cor(x, use= , method= )
method有三種砚殿,pearson spearman kendall啃憎,默認是 pearson

cov()計算協(xié)方差。

states<- state.x77[,1:6]
cov(states) #協(xié)方差
cor(states) #相關系數(shù)
cor(states, method="spearman") # spearman等級相關
x <- states[,c("Population", "Income", "Illiteracy", "HS Grad")]
y <- states[,c("Life Exp", "Murder")]
cor(x,y) #計算得到4*2的相關矩陣

cor.test() 用來對相關系數(shù)的顯著性進行檢驗

但是一次只能檢驗一種相關關系似炎。
用法:cor.test(x, y, alternative = , method = )
alternative 取值有:"two.side" "less"或"greater"辛萍。默認是 two.side,表示雙尾檢驗(總體相關系數(shù)不等于!=0)羡藐。
less 表示贩毕,假設為 總體相關系數(shù)<0;greater 表示仆嗦,假設為 總體相關系數(shù)>0
method有三種辉阶,pearson spearman kendall,默認是 pearson
cor.test(states[,3], states[,5])

如果要檢驗多種相關關系欧啤,需要使用 psych包中的corr.test()

用法:corr.test(x, y = NULL, use = "pairwise",method="pearson",adjust="holm",alpha=.05,ci=TRUE,minlength=5)

install.packages("psych")
library(psych)
corr.test(states, use="complete")
# 輸出的結果里,對角線上方的數(shù)據(jù) 是經過多重比較矯正的結果启上。下方的是沒有矯正的p值邢隧。
# use的取值 可以是 pairwise 和 complete,分別表示對缺失值執(zhí)行成對刪除 或 行刪除冈在。

pcor() 計算偏相關

用法:pcor(u, S)
u是數(shù)值向量倒慧,前兩個數(shù)值為要計算相關系數(shù)的變量下標,其余的變量為要排除影響的變量下標。

install.packages("ggm")
library(ggm)
colnames(states)
pcor(c(1,5,2,3,6), cov(states)) #偏相關 等價于 pcor(c("Population","Murder","Income","Illiteracy","HS Grad"), cov(states))
# 在本例中纫谅,1,5對應的變量("Population","Murder")是計算相關的變量炫贤,2,3,6 ("Income","Illiteracy","HS Grad")是需要排除影響的變量。

pcor.test 偏相關系數(shù)的顯著性檢驗

用法:pcor.test(r, q, n)
r是偏相關系數(shù)付秕,q是要控制的變量數(shù)(以數(shù)值表示位置)兰珍,n為樣本大小。
pcor.test(pcor(c(1,5,2,3,6), cov(states)),3,50)# 輸出結果為 t值询吴、df值和p值

t檢驗

獨立樣本t檢驗

使用方法:t.test(y ~ x, data)t.test(y1, y2)
默認參數(shù)是掠河,假設方差不齊的t檢驗,雙側檢驗猛计。
如果想要輸出方差齊的t檢驗唠摹,需要加入 var.equal=TRUE

library(MASS) #使用MASS包中的數(shù)據(jù)集來做練習
w<-t.test(Prob ~ So, data=UScrime)
w<-t.test(Prob ~ So, data=UScrime,var.equal=TRUE)

獨立樣本的非參數(shù)檢驗

wilcoxon秩和檢驗,也被稱作為 mann-whitney u檢驗

使用方法:wilcox.test(y ~ x, data)wilcox.test(y1, y2)

with(UScrime, by(Prob, So, median))
wilcox.test(Prob ~ So, data=UScrime)

配對樣本t檢驗

不需要方差齊性的假設
使用方法: t.test(y1, y2, paired=TRUE)

sapply(UScrime[c("U1","U2")], function(x)(c(mean=mean(x),sd=sd(x))))
with(UScrime, t.test(U1, U2, paired=TRUE))

非獨立(配對)樣本的非參數(shù)檢驗

wilcoxon符號秩和檢驗

使用方法:wilcox.test(y1, y2, paired=TRUE)

sapply(UScrime[c("U1","U2")], median)
with(UScrime, wilcox.test(U1, U2, paired=TRUE))

回歸

對于OLS回歸奉瘤,通過使得 預測誤差(殘差)平方和最小對影響變量的解釋力度(R平方)最大勾拉,可獲得模型參數(shù)。

簡單線性回歸

lm()函數(shù)

用法:myfit <- lm(formula, data)

formula的形式為:Y~ X1 + X2 + ... + Xk
~ 左邊為響應變量(因變量)盗温,~右邊是各個預測變量(自變量)藕赞,預測變量之間用+符號隔開。
:符號表示變量的交互項肌访。例如 y~x+z+x:z
*符號表示所有可能交互項的簡潔方式找默。例如代碼 y~xzw 等價于 y ~ x + z + w + x:z + x:w + z:w + x:z:w
^符號表示交互項達到某個次數(shù)。代碼 y~(x+z+w)^2 就代表交互項就到2階交互吼驶。等價于 y ~ x + z + w + x:z + x:w + z:w
.符號表示 除了因變量外的所有變量惩激,這里不包含交互作用。如果一個數(shù)據(jù)框包含變量 x y z w蟹演。那么 代碼 y~. 等價于 y ~ x + z + w
-符號表示從等式中移除某個變量风钻。例如 y~(x+z+w)^2-x:w 等價于 y ~ x + z + w + x:z + z:w

-1 表示 刪除截距項。y~x-1 擬合y在x上的回歸酒请,并強制直線通過原點骡技。截距為0。

summary() 展示擬合模型的詳細結果
coefficients() 列出擬合模型的模型參數(shù)(截距項和斜率β)
confint() 計算模型參數(shù)的置信區(qū)間(默認是95%)
fitted() 列出擬合模型的預測值
residuals() 列出擬合模型的殘差:預測值-實際值
anova() 1.生成一個擬合模型的方差分析表 或2. 比較兩個或多個擬合模型的方差分析表羞反。

vcov() 列出擬合模型的協(xié)方差矩陣
AIC() 輸出赤池信息統(tǒng)計量
plot() 生成評價擬合模型的診斷圖
predict()用擬合模型對新的數(shù)據(jù)集預測響應變量值

fit <- lm(weight ~ height, data=women)
summary(fit)

結果里面的兩個參數(shù) Multiple R-squared 和 Adjusted R-squared 的值:
R-squared 表示模型可以解釋預測變量的方差布朦,也就是模型預測變量(預測值)解釋響應變量(真實值)的程度。也是實際值和預測值之間相關系數(shù)的平方昼窗。Adjusted R-squared 與之類似是趴,但是考慮了模型的參數(shù)數(shù)目。

women$weight
fitted(fit)
residuals(fit)
plot(women$height,women$weight,
     xlab="Height (in inches)",
     ylab="Weight (in pounds)")
abline(fit)
par(mfrow=c(2,2)) #兩行兩列的圖展示在一起
plot(fit) #輸出四張圖 可以檢驗正態(tài)性 方差齊性 和異常值

線性回歸的前提條件

1. 正態(tài)性

1.1 使用performance包 check_normality()

library(performance)
x<-check_normality(fit)
plot(x,type = "qq") #畫qq圖
plot(x, type = "pp") #畫pp圖
plot(x) #畫殘差的正態(tài)分布圖

1.2 不使用包 直接畫標準化殘差 qq圖

qqnorm(residuals(fit))
qqline(residuals(fit))

1.3 使用car包里的qqPlot() 畫t分布下的學生化/標準化殘差 qq圖

library(car)
qqPlot(fit)

1.4 直接畫直方圖

hist(residuals(fit))

2. 檢驗自變量和因變量是否是線性關系

library(car)
crPlots(fit)

3. 檢驗方差齊性

3.1 直接畫預測值和殘差圖 殘差沒有標準化

plot(fitted(fit),residuals(fit)) 
abline(h=0,lty=2)

3.2 使用performance包 check_heteroscedasticity()

x<-check_heteroscedasticity(fit)
plot(x)

3.3 使用car包中的 ncvTest()來做檢驗澄惊,同時用spreadLevelPlot()畫圖

library(car)
ncvTest(fit)
spreadLevelPlot(fit)

4. 誤差的獨立性

檢驗誤差的序列相關性(看到一個資料說唆途,僅僅時序類數(shù)據(jù)需要進行該診斷)富雅。

使用car包中的durbinWatsonTest()函數(shù)來進行 Durbin-Watson 檢驗。

durbinWatsonTest(fit)

線性模型假設的綜合檢驗

gvlma包中的gvlma()函數(shù)

gvlma()函數(shù)只適用于 lm()模型

install.packages("gvlma")
library(gvlma)
gvmodel <- gvlma(fit)
summary(gvmodel)

回歸中的多重共線性問題

可用統(tǒng)計量 VIF(Variance Inflation Factor,方差膨脹因子) 來檢測
vif>5 就認為存在嚴重的共線性肛搬。<5可以忽略

1. 可用car包中的vif()函數(shù)來計算得到

library(car)
vif(fit)
# sqrt(vif(fit)) > 2 # problem?

2. 可用performance包中的check_collinearity()函數(shù)來計算得到

check_collinearity(fit)

離群點檢測

car包中的outlierTest()

outlierTest()函數(shù)可以求得最大標準化殘差絕對值 Bonferroni 調整后的p值
該函數(shù)只根據(jù)單個最大(正或負)殘差值的顯著性來判斷是否有離群點没佑。若不顯著則說明數(shù)據(jù)集中沒有離群點;若顯著温赔,則你必須刪除該離群點蛤奢,然后在檢測是否還有其他的離群點存在。

library(car)
outlierTest(fit)

強影響點檢測

cutoff <- 4/(nrow(states)-length(fit$coefficients)-2) 
cutoff<-1
plot(fit, which=4, cook.levels=cutoff)
abline(h=cutoff, lty=2, col="red")

1. performance包中的check_outliers()

check_outliers(fit)

二項式回歸

fit2 <- lm(weight ~ height + I(height^2), data=women)
summary(fit2)
fitted(fit2)
plot(women$height,women$weight,
     xlab="Height (in inches)",
     ylab="Weight (in lbs)")
lines(women$height,fitted(fit2))
par(mfrow=c(2,2)) 
plot(fit2)

多元線性回歸

多元就是指 多個自變量让腹。

states <- as.data.frame(state.x77[,c("Murder", "Population", "Illiteracy", "Income", "Frost")])
cor(states) #做多元回歸之前远剩,最好先計算一下變量之間的相關性。
fit <- lm(Murder ~ Population + Illiteracy + Income + Frost, data=states)
summary(fit)
confint(fit)

檢驗誤差的序列相關性(看到一個資料說骇窍,僅僅時序類數(shù)據(jù)需要進行該診斷)瓜晤。

使用car包中的durbinWatsonTest()函數(shù)來進行 Durbin-Watson 檢驗。

library(car)
durbinWatsonTest(fit)
crPlots(fit)

有顯著交互項的多元線性回歸

fit <- lm(mpg ~ hp + wt + hp:wt, data=mtcars)
summary(fit)
install.packages("effects")
library(effects) 
# 用effects包的 effect()函數(shù)來畫圖展示 交互項的結果
# 用法:plot(effect(term,mod,,xlevels),multiline=TRUE)
# term是要畫的項腹纳,mod是lm()擬合的模型痢掠,xlevels是一個list,用來指定變量要設定的常量值嘲恍。
# multiline=TRUE 表示添加多條相應直線足画。multiline=FALSE 表示多個xlevels分開畫多圖。
plot(effect("hp:wt", fit,, list(wt=c(2.2,3.2,4.2))), multiline=TRUE)
plot(effect("hp:wt", fit,, list(wt=c(2.2,3.2,4.2))), multiline=FALSE)

模型比較

1. 用anova()函數(shù)進行模型比較

注意用anova()函數(shù)比較模型時佃牛,模型需要是嵌套模型淹辞。就比如下面的例子中,一個模型fit1包含了fit2俘侠。

states <- as.data.frame(state.x77[,c("Murder", "Population", "Illiteracy", "Income", "Frost")])
fit1 <- lm(Murder ~ Population + Illiteracy + Income + Frost, data=states)
fit2 <- lm(Murder ~ Population + Illiteracy, data=states)
anova(fit2, fit1)
# 結果顯示p>0.05象缀,并不顯著。說明兩個模型fit1和fit2的擬合效果一樣好爷速。所以可以從模型中去掉"Income", "Frost"兩個變量央星。

2. 用AIC(Akaike Information Criterion,赤池信息準則)來比較模型

AIC考慮了模型統(tǒng)計擬合度以及用來擬合的參數(shù)數(shù)目惫东。AIC越小莉给,代表模型擬合的越好,說明模型用較少的參數(shù)獲得了足夠的擬合度廉沮。

AIC方法不需要模型之間是嵌套關系颓遏。

fit1 <- lm(Murder ~ Population + Illiteracy + Income + Frost, data=states)
fit2 <- lm(Murder ~ Population + Illiteracy, data=states)
AIC(fit1,fit2)

怎么選擇“最佳”模型

如何確定在模型中保留哪些變量 模型是最優(yōu)的呢。anova()一般用于有2滞时,3個模型比較的時候叁幢。如果模型特別多,該怎么辦呢漂洋?

1. 逐步回歸:向前逐步回歸遥皂、向后逐步回歸、向前向后逐步回歸

使用MASS包中的stepAIC()函數(shù)

依據(jù)的是 精確AIC準則
下面是一個向后回歸的例子

library(MASS)
states <- as.data.frame(state.x77[,c("Murder", "Population", "Illiteracy", "Income", "Frost")])
fit <- lm(Murder ~ Population + Illiteracy + Income + Frost, data=states)
stepAIC(fit, direction="backward")

2. 全子集回歸

全子集回歸中刽漂,所有可能的模型都會被檢驗演训。

使用leaps包中的regsubsets()函數(shù)

可以通過R平方,調整R平方或Mallows Cp 統(tǒng)計量等準則來選擇“最佳”模型

install.packages("leaps")
library(leaps) 
states <- as.data.frame(state.x77[,c("Murder", "Population", "Illiteracy", "Income", "Frost")])
leaps <-regsubsets(Murder ~ Population + Illiteracy + Income + Frost, data=states, nbest=4)
plot(leaps, scale="adjr2")
# 結果可以用car包中的subsets()函數(shù)繪制
library(car)
subsets(leaps, statistic="cp",
        main="Cp Plot for All Subsets Regression")
abline(1,1,lty=2,col="red")

交叉驗證

通過交叉驗證法贝咙,可以評價回歸方程的泛化能力样悟。

交叉驗證:將一定比例的數(shù)據(jù)挑選出來作為訓練樣本(訓練集),另外的樣本作為保留樣本(測試集)庭猩。先在訓練樣本上獲取回歸方程窟她,然后在保留樣本上做預測。
在k重交叉驗證中蔼水,樣本被分為k個子樣本震糖,輪流k-1個子樣本組合作為訓練集,另外1個樣本作為測試集趴腋。
這樣就可以得到k個預測方程吊说,將k個預測集的預測表現(xiàn)結果求平均值。

1. R平方的k重交叉驗證:bootstrap包中crossval()函數(shù)

方差分析

以下的概念中:大寫字母表示組別因子优炬,小寫表示定量變量颁井。
單因素方差分析ANOVA:y~A
含單個協(xié)變量的單因素協(xié)方差分析ANCOVA:y~x+A
雙因素ANOVA:y~AB
含兩個協(xié)變量的兩因素協(xié)方差分析ANCOVA:y~x1+x2+A
B
隨機化區(qū)組:y~B+A(B是區(qū)組因子)
單因素組內ANOVA(單因素重復測量anova):y~A+Error(Subject/A)
含單個組內因子(W)和單個組間因子(B)的重復測量anova:y~B*W+Error(Subject/W)
均衡設計(balanced design)是指 每個實驗條件下的被試量相等。否則就是非均衡設計(unbalanced design)蠢护。
有多個(大于一個)因變量的設計被稱為多元方差分析(MANOVA)雅宾,若有協(xié)變量,則被稱為 多元協(xié)方差分析(MANCOVA)葵硕。

表達式的順序 在以下兩種情況下眉抬,會對結果產生影響:

  1. 因子不止一個,且是非均衡設計贬芥;
  2. 存在協(xié)變量吐辙。
  • 類型I方法(序貫型) 計算ANOVA效應:
    因為R中默認 使用類型I方法: y~A+B+A:B
    A對y的影響;A不做調整
    控制A時蘸劈,B對y的影響昏苏;B根據(jù)A調整
    控制A和B的主效應時,A與B的交互效應威沫。A:B交互項根據(jù)A和B調整贤惯。
  • 類型II(分層型):
    效應根據(jù)同水平或低水平的效應做調整。A根據(jù)B調整棒掠,B根據(jù)A調整孵构,A:B交互項同時根據(jù)A和B調整。
  • 類型III(邊界型):SPSS 和 SAS 默認使用的是類型III烟很。所以如果要得到相同的結果颈墅,需要使用類型III蜡镶。aov()函數(shù)默認使用的是類型I的方法,若要使用類型III恤筛,需要用car包中的Anova()函數(shù)官还,具體可參考 help(Anova,package="car")。
    每個效應根據(jù)模型其他各效應做相應調整毒坛。A根據(jù)B和A:B做調整望伦,A:B交互項根據(jù)A和B調整。

樣本大小越不平衡煎殷,效應項的順序對結果的影響越大屯伞。一般來說,越基礎性的效應越需要放在表達式前面豪直。具體來講:
首先是協(xié)變量劣摇,然后是主效應,接著是雙因素的交互項弓乙,再接著是三因素的交互項饵撑,以此類推。
對于主效應唆貌,越基礎性的效應越應放在表達式前面滑潘。

aov(formula, data=dataframe)

單因素方差分析 one-way anova

單因素方差分析 對應的 非參數(shù)檢驗 數(shù)據(jù)之間獨立

Kruskal-Wallis檢驗

使用方法:kruskal.test(y ~ A, data)

states <- data.frame(state.region, state.x77)
kruskal.test(Illiteracy ~ state.region, data=states)
# 通過r語言實戰(zhàn)第二版書中 作者寫的wmc函數(shù) 做事后檢驗的多重比較
source("http://www.statmethods.net/RiA/wmc.txt")
wmc(Illiteracy ~ state.region, data=states, method="holm")
help(p.adjust) #查看其它多重比較矯正的方法
# p.adjust.methods 
# c("holm", "hochberg", "hommel", "bonferroni", "BH", "BY",
#   "fdr", "none")

單因素重復測量方差分析 對應的 非參數(shù)檢驗 數(shù)據(jù)之間不獨立

Friedman檢驗

使用方法:friedman.test(y ~ A | B, data)

RoundingTimes <-
  matrix(c(5.40, 5.50, 5.55,
           5.85, 5.70, 5.75,
           5.20, 5.60, 5.50,
           5.55, 5.50, 5.40,
           5.90, 5.85, 5.70,
           5.45, 5.55, 5.60,
           5.40, 5.40, 5.35,
           5.45, 5.50, 5.35,
           5.25, 5.15, 5.00,
           5.85, 5.80, 5.70,
           5.25, 5.20, 5.10,
           5.65, 5.55, 5.45,
           5.60, 5.35, 5.45,
           5.05, 5.00, 4.95,
           5.50, 5.50, 5.40,
           5.45, 5.55, 5.50,
           5.55, 5.55, 5.35,
           5.45, 5.50, 5.55,
           5.50, 5.45, 5.25,
           5.65, 5.60, 5.40,
           5.70, 5.65, 5.55,
           6.30, 6.30, 6.25),
         nrow = 22,
         byrow = TRUE,
         dimnames = list(1 : 22,
                         c("Round Out", "Narrow Angle", "Wide Angle")))
friedman.test(RoundingTimes)
## => strong evidence against the null that the methods are equivalent
##    with respect to speed
wb <- aggregate(warpbreaks$breaks,
                by = list(w = warpbreaks$wool,
                          t = warpbreaks$tension),
                FUN = mean)
wb
friedman.test(wb$x, wb$w, wb$t)
friedman.test(x ~ w | t, data = wb)
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市锨咙,隨后出現(xiàn)的幾起案子语卤,更是在濱河造成了極大的恐慌,老刑警劉巖酪刀,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件粹舵,死亡現(xiàn)場離奇詭異,居然都是意外死亡骂倘,警方通過查閱死者的電腦和手機眼滤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來历涝,“玉大人诅需,你說我怎么就攤上這事∮猓” “怎么了堰塌?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長分衫。 經常有香客問我场刑,道長,這世上最難降的妖魔是什么蚪战? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任牵现,我火速辦了婚禮铐懊,結果婚禮上,老公的妹妹穿的比我還像新娘瞎疼。我一直安慰自己居扒,他們只是感情好,可當我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布丑慎。 她就那樣靜靜地躺著,像睡著了一般瓤摧。 火紅的嫁衣襯著肌膚如雪竿裂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天照弥,我揣著相機與錄音腻异,去河邊找鬼。 笑死这揣,一個胖子當著我的面吹牛悔常,可吹牛的內容都是我干的。 我是一名探鬼主播给赞,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼机打,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了片迅?” 一聲冷哼從身側響起残邀,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎柑蛇,沒想到半個月后逃呼,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體浙垫,經...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了增炭。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡轰绵,死狀恐怖聪铺,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情摄杂,我是刑警寧澤都弹,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站匙姜,受9級特大地震影響畅厢,放射性物質發(fā)生泄漏。R本人自食惡果不足惜氮昧,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一框杜、第九天 我趴在偏房一處隱蔽的房頂上張望浦楣。 院中可真熱鬧,春花似錦咪辱、人聲如沸振劳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽历恐。三九已至,卻和暖如春专筷,著一層夾襖步出監(jiān)牢的瞬間弱贼,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工磷蛹, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留吮旅,地道東北人。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓味咳,卻偏偏與公主長得像庇勃,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子槽驶,可洞房花燭夜當晚...
    茶點故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內容

  • 第一課:安裝與基本操作 R的擴展包在R官網CRAN责嚷;另外,R官網還包含很多擴展資料掂铐,包括源代碼再层,手冊,F(xiàn)AQ堡纬,推薦...
    lizi_sjtu閱讀 644評論 0 0
  • R語言與數(shù)據(jù)挖掘:公式聂受;數(shù)據(jù);方法 R語言特征 對大小寫敏感 通常烤镐,數(shù)字蛋济,字母,. 和 _都是允許的(在一些國家還...
    __一蓑煙雨__閱讀 1,640評論 0 5
  • 《R語言實戰(zhàn)》筆記系列 本章學習大綱 1.描述性統(tǒng)計分析 2.頻數(shù)表和列聯(lián)表 3.相關系數(shù)和協(xié)方差 4.t檢驗 5...
    一日如十年閱讀 1,280評論 0 1
  • 前面簡要介紹了R語言的基本數(shù)據(jù)結構和基礎圖形炮叶,本節(jié)將簡單介紹如何得到數(shù)據(jù)的描述性統(tǒng)計分析碗旅,以及進一步了解列聯(lián)表(也...
    井底蛙蛙呱呱呱閱讀 2,178評論 0 1
  • 20180316(從有道遷移) 基本統(tǒng)計分析 描述性統(tǒng)計分析常用庫:基礎方法summary;summary()函數(shù)...
    KrisKC閱讀 394評論 0 2