R与统计分析

时间:2020-12-15 16:50:00

本文主要来自<<Modern Applied Statistic with S>>一书

1. 基础知识

(1)factor重命名

#################################################################
# 将因素型转换重新命名
#################################################################
factorTest <- factor(c('just so so ','good', 'better', 'better', 'good', 'best', 'good', 'better'))
factorTest
factorLable <- ordered(factorTest, labels = c(">90", '80-90', '70-80', '<70'))
factorLable

R与统计分析

(2)基本操作函数

search()
objects()
rm(list = ls())
find("objects")

(3)单变量统计分析

x <- rt(250, df = 9)
par(pty = "s")
qqnorm(x)
qqline(x)


# 拟合数据属于何种分布,可使用MASS包中的fitdistr()
library(MASS)
x <- rgamma(100, shape = 5, rate = 0.1)
fitdistr(x, 'gamma')

x2 <- rt(250, df = 9)
fitdistr(x2, "t", df = 9)

fitdistr(x2, 't')



data(shoes)
head(shoes)
shoes

(4)数据录入

mydata <- data.frame(id = 1, name = 'Lily', age = 10)
Edit.data(mydata)
fix(mydata) #更改数据并保存
edit(mydata) #仅修改数据
mydata

2. Linear Statistical Model

(1)方差分析实例

library(MASS)
whiteside
str(whiteside)
R与统计分析

?xyplot
xyplot(Gas ~ Temp | Insul, whiteside, panel = function(x, y, ...) {
panel.xyplot(x, y, ...)
panel.lmline(x, y, ...)
}, xlab = "Average external temperature(deg.C)",
ylab = "Gas consumption(1000 cubic feet)",
aspect = "xy",
strip = function(...) strip.default(..., style = 1)
)

R与统计分析

?lm
##############################
#构建Insul等于"Before"的模型
##############################
gasB <- lm(Gas ~ Temp, data = whiteside, subset = Insul == 'Before')
##############################
#update用于更改模型
##############################
gasA <- update(gasB, subset = Insul == 'After')
#############################################################fitted model objects#对模型的更进一步操作包括:# print: 简单的display# summary: 分析output# coef(coefficient):提取出regression coefficeints# resid(residuals):残差# fitted(fitted.values):拟合值# deviance: redisual sum of squares# anova:方差分析# predict:对新数据的means或standard errors的预测# plot: 诊断图############################################################summary(gasB)summary(gasA)

R与统计分析

R与统计分析

########################################
# 样本方差分析
########################################
gasB
summary(gasB)
deviance(gasB)
gasB$df.resid
varB <- deviance(gasB)/gasB$df.resid #直接计算
varB

varB1 <- summary(gasB)$sigma^2 #可供选择的方案,等同于直接计算
varB1

R与统计分析

#####################################################################################################
#将两个模型整体到一个里面去
# a/x术语的意义是:a是一个factor,在不同a的水平上x对应的模型
# 本例中 Insul/Temp - 1意思是在不同Insul水平上,对应的Temp模型,- 1表示省略掉截距
#####################################################################################################
gasBA <- lm(Gas ~ Insul/Temp - 1, data = whiteside)
summary(gasBA)

R与统计分析

##############################
# 拟合曲线
# 'identity' function I(...)
##############################
gasQ <- lm(Gas ~ Insul/(Temp + I(Temp^2)) - 1, data = whiteside)
summary(gasQ)
summary(gasQ)$coef

R与统计分析

##########################################################
# parallel regression
# R: options(contrasts = c("contr.helmert", "contr.poly"))
##########################################################
gasPR <- lm(Gas ~ Insul + Temp, data = whiteside)
gasPR
anova(gasPR, gasBA) #方差分析

R与统计分析

#####################################
# 使用不同的参数,分开slopes来拟合模型
#####################################
options(contrasts = c("contr.treatment", "contr.poly"))
gasBA1 <- lm(Gas ~ Insul*Temp, data = whiteside)
summary(gasBA1)$coef
R与统计分析

(2)回归诊断实例

模型拟合可通过残差的分析来判断

library(MASS)
head(hills)
str(hills)
(hills.lm <- lm(time ~ dist + climb, data = hills))
R与统计分析

frame()  # create/start a new plot frame
par(fig = c(0, 0.6, 0, 1))
??fig
plot(fitted(hills.lm), studres(hills.lm))
abline(h = 0, lty = 2)
identify(fitted(hills.lm), studres(hills.lm), row.names(hills))
par(fig = c(0.6, 1, 0, 1), pty = "s", new = TRUE)
qqnorm(studres(hills.lm))
qqline(studres(hills.lm))
hills.hat <- lm.influence(hills.lm)$hat
cbind(hills, lev = hills.hat)[hills.hat > 3/35, ]
R与统计分析

R与统计分析


#查看Knock Hill的预测值
cbind(hills, pred = predict(hills.lm))["Knock Hill", ]

(hills1.lm <- update(hills.lm, subset = -18))

R与统计分析

#######################################################
# 可以看到踢除Knock Hill对模型参数没有较大影响
# 考虑检测一下其他两个离异点
#######################################################
update(hills.lm, subset = - c(7, 18))
summary(hills1.lm)

summary(update(hills1.lm, weights = 1/dist^2))

lm(time ~ -1 + dist + climb, hills[-18, ], weights = 1/dist^2)

R与统计分析

R与统计分析


hillsNew <- hills
head(hillsNew)
hillsNew$ispeed <- hillsNew$time/hillsNew$dist
hillsNew$grad <- hillsNew$climb/hillsNew$dist
(hills2.lm <- lm(ispeed ~ grad, data = hillsNew[-18, ]))

R与统计分析

frame()
par(fig = c(0, 0.6, 0, 1))
plot(hillsNew$grad[-18], studres(hills2.lm), xlab = 'grad')
abline(h = 0, lty = 2)
identify(hillsNew$grad[-18], studres(hills2.lm), row.names(hillsNew)[-18])
par(fig = c(0.6, 1, 0, 1), pty = 's', new = TRUE)
qqnorm(studres(hills2.lm))
qqline(studres(hills2.lm))

R与统计分析


hills2.hat <- lm.influence(hills2.lm)$hat
cbind(hillsNew[-18, ], lev = hills2.hat)[hills2.hat > 1.8*2/34, ]

R与统计分析