目录
3.1数据的收集
3.2 数据的整理
3.3 描述统计量
3.4 图像的绘制
3.5 正态性检验与分布拟合
3.6 一些R函数的总结与补充
3.7 补充题:Create a calendar!
总体:研究对象的总体。
个体:总体中的一个基本单位。
样本:若干个体的集合(统计研究的主要对象)。
样本容量:样本中的个体数。
频数:将数值的取值范围划分成若干个区间,这组数据在每个区间中出现的次数。
频数表:由区间中点和对应频数组成的表。
直方图:频数分布图。
统计量:由样本加工出来的,集中反映样本特征的函数。(样本均值,样本方差,样本标准差等)
注:统计量一般分为三类:表示位置的,表示变异程度的,表示分布形状的
mean(x,trim=0,na.rm=FALSE)
w.mean<-mean(w)
i. trim 的取值在(0,0.5),表示去除异常值的比例(截尾平均值)
ii. 若有数据缺失,则 na.rm=TRUE
iii. x 可以是向量,矩阵,数组,数据框
iv. 类似的还有求和函数 sum(x,na.rm=FALSE)
v. 加权平均数 weighted.mean(x,w,na.rm=FALSE) ,其中 w 为权数系数
eg:x<-c(1,2,3) w<-c(1/3,1/3,1/3) weighted.mean(x,w)
sort(x,na.last=NA,decreasing=FALSE,
method=c("shell"),index,return=FALSE)
i. na.last 是控制是否处理缺失数据的变量,默认值为 NA ,表示不处理缺失数据,若值为 TRUE,则把缺失数据放在最后
ii. decreasing 是关于升序和降序的选择,默认值FALSE为升序排列
iii. method 为排序方法,如示例中 "shell" 则为选择了希尔排序作为排序法
iv. index.return 表示是否返回排序的下标
v. 关于排序的函数还有 rank 和 order ,其中 rank 是返回每个元素对应的“排名”,order 是返回对应排名所在的位置
median(x,na.rm=FALSE)
quantile(x,probs=seq(0,1,0.25))
i. probs 在此表示分位的方法(概率),如示例中就是把分成了0%,25%,50%,75%,100%
var(x,y=NULL,na.rm=FALSE)
sd(x,na.rm=FALSE)
用处是刻画数据的相对分散性,其公式为:
cv<-100*sd(w)/mean(w);cv
CSS为样本校正平方和,其公式为:
css<-sum((w-mean(w))^2);css
USS为样本未校正平方和,其公式为:
uss<-sum(w^2);uss
样本极差是样本极大值和极小值的差,其公式为:
range<-max(w)-min(w)
注:样本四分位差:Interquartile_Range=Q3-Q1
样本标准误的公式为:
sm<-sd/sqrt(leangth(w))
偏度用于刻画分布的对称性,其公式为:
注:关于均值对称的数据,g1为0;右侧更分散的数据,g1为正;反之为负
峰度用于刻画分布在标准化到方差为1时,尾部的“厚度”,其公式为:
注:当数据的总体分布为正态分布时,g2接近于0
cl<-read.table("c:\\exam.123.txt",header=TRUE)
hist(x,breaks="Sturges",freq=NULL,probability=!freq,...)
i. breaks 规定组距
ii. freq 是一个逻辑变量,若为 TRUE 则绘制频度分布图,若为 FALSE 则绘制密度分布图
iii. density() 绘制核密度估计
plot(ecdf(x),ylab="Fn(x)",verticals=FALSE,col.01line="gray70")
i. ecdf() 经验累积分布函数
ii. ylab 表示 y 轴的标签,这里的 Fn(x) 表示累积分布函数
iii. verticals 是一个逻辑变量,为 FALSE 则表示不在图上绘制垂直线
iv. col.01line 控制绘制曲线的颜色
qqnorm(y,ylim,xlab="x",ylab="y",plot.it=TRUE,datax=FALSE)
i. ylim 指定 y 轴范围
ii. ylab 表示 y 轴的标签,xlab表示x轴的标签
iii. plot.it 为可选参数,默认为 TRUE ,表示是否绘制 Q-Q 图。如果设置为 FALSE ,则只计算 Q-Q 统计量而不绘制图形
iv. datax 为可选参数,默认为 FALSE ,表示在 Q-Q 图上使用经验分布的百分位数。如果设置为TRUE ,则使用数据向量的百分位数
qqplot(x,y,plot.it=TRUE)
i. 这段R代码使用 qqplot 函数来生成散点图,用于比较两个数据集 x 和 y 是否满足正态分布
ii. plot.it 为可选参数,默认为 TRUE ,表示是否绘制散点图。如果设置为 FALSE ,则仅计算 Q-Q 统计量而不进行图形绘制
stem(x,scale=0.5)
i. 茎叶图一般用于展现数据的分布结构
ii. scale 为可选参数,后面的数值是茎叶图的缩放因子,决定了在叶子中显示多少位数。在这个例子中,设置为0.5,表示叶子中显示的数字将被缩小到原来的一半
boxplot(x)
箱线图一般用于直观展现数据分布的特征
fivenum(x)
五数概括包括:中位数,上四分位数,下四分位数,最大值,最小值
一般地,$ 用于提取数据框或列表中的变量(列),例如:
# 创建一个数据框
my_data <- data.frame(
x = c(1, 2, 3, 4, 5),
y = c(2, 4, 1, 6, 3)
)
# 使用$符号提取数据框中的列
x_values <- my_data$x
y_values <- my_data$y
在绘图时,这也是一种非常方便的提取变量的方式,例如:
plot(my_data$x, my_data$y, main = "Scatter Plot", xlab = "X", ylab = "Y")
下面这段示例代码全方位展示了 par 函数的主要功能:
# 创建一个简单的散点图,并使用par()函数调整图形参数
# 生成一些示例数据
x <- rnorm(100)
y <- x + rnorm(100)
# 打开一个新的图形窗口
plot.new()
# 使用par()函数设置图形参数
par(
mfrow = c(1, 2), # 将图形区域划分为1行2列
mar = c(4, 4, 2, 1), # 设置图形的边距(下、左、上、右)
oma = c(0, 0, 2, 0), # 设置外部边距(下、左、上、右)
cex.main = 1.2, # 设置主标题的字符大小
cex.lab = 1.0, # 设置轴标签的字符大小
mfcol = c(1, 2) # 设置多图布局
)
# 绘制第一个散点图
plot(x, y, main = "Scatterplot 1", xlab = "X", ylab = "Y")
# 绘制第二个散点图
plot(y, x, main = "Scatterplot 2", xlab = "Y", ylab = "X")
这段示例代码完成的结果如下:
pairs 函数一般用于绘制数据框或列表中每两列变量之间的散点图矩阵,例如:
# 假设 w 是一个数据框,包含多个变量
w <- data.frame(
x = rnorm(100),
y = rnorm(100),
z = rnorm(100)
)
# 使用 pairs 函数创建散点图矩阵
pairs(w)
绘制结果如下:
coplot用于绘制条件散点图,这种图形允许你在观测到一个或多个条件下研究两个变量之间的关系,例如:
# 创建一个示例数据框
data <- data.frame(
y = rnorm(100),
x = rnorm(100),
z = factor(rep(1:2, each = 50)) # 条件变量
)
# 使用coplot()绘制条件散点图
coplot(y ~ x | z, data = data)
结果:
i. 高级绘图函数:直接绘制图形,并可以自动生成坐标轴等细节。例如:plot 函数,hist 函数...
ii. 低级绘图函数:低级绘图函数提供了更灵活和精细的控制,它们可以用于修改已有图形的一些性质。例如:lines 函数,text 函数...
Shapiro-Wilk W 检验是一种用于检验数据是否来自正态分布的统计方法。它对于小到中等样本量的数据集是一种有效的方法。检验的零假设是数据符合正态分布。在 R 中,我们可以用shapiro.text函数对一组数据进行检验,例如:
# 生成一个例子数据集
data <- rnorm(50)
# 执行Shapiro-Wilk W检验
result <- shapiro.test(data)
# 打印检验结果
print(result)
结果如下:
我们可以根据 p-value 判定结果,若 p-value<0.05,则拒绝原假设;若 p-value>0.05,则接受原假设。如上面的示例,p-value=0.4463>0.05,我们接受原假设,认为例子数据集服从正态分布。
Kolmogorov-Smirov(KS) 经验分布检验是一种用于检验一个样本是否来自特定的分布的非参数检验方法。它的 R 示例为:
# 生成一个例子数据集
data <- rnorm(100)
# 执行Kolmogorov-Smirnov检验,假设数据来自正态分布
result <- ks.test(data, "pnorm")
# 打印检验结果
print(result)
其中"pnorm"决定了我们的原假设是样本服从正态分布,
结果如下:
我们可以根据 p-value 判定结果,若 p-value<0.05,则拒绝原假设;若 p-value>0.05,则接受原假设。如上面的示例,p-value=0.7599>0.05,我们接受原假设,认为例子数据集服从正态分布。
data <- rnorm(100)
n <- length(data) # 样本大小
m <- mean(data) # 样本均值
v <- var(data) # 样本方差
s <- sd(data) # 样本标准差
me <- median(data)# 样本中位数
# 计算变异系数(Coefficient of Variation)
cv <- 100 * s / m
# 计算总离差平方和(Corrected Sum of Squares)
css <- sum((data - m)^2)
# 计算未加权和的平方和(Unweighted Sum of Squares)
uss <- sum(data^2)
# 计算样本极差(Range)
R <- max(data) - min(data)
# 计算四分位距(Interquartile Range)
R1 <- quantile(data, 3/4) - quantile(data, 1/4)
# 计算标准误差(Standard Error)
sm <- s / sqrt(n)
# 计算样本偏度(Sample Skewness)
g1fd <- sum((data - m)^3) * length(data) / ((length(data)-1) * (length(data)-2) * s^3)
# 计算样本峰度(Sample Kurtosis)
g2pd <- sum((data - m)^4) * length(data) / ((length(data)-1) * (length(data)-2) * (length(data)-3) * s^4) - 3 * (length(data)-1)^2 / ((length(data)-2) * (length(data)-3))
n;m;v;s;me;cv;css;uss;R;R1;sm;g1fd;g2pd;
计算结果如下:
# 生成一个例子数据集
data <- c(23, 54, 12, 76, 43.222, 12)
# 计算数据的乘积
product_result <- prod(data)
# 找到数据中的最大值的索引
max_index <- which.max(data)
# 找到数据中的最小值的索引
min_index <- which.min(data)
# 将数据翻转(倒序)
reversed_data <- rev(data)
# 对数据进行四舍五入,保留一位小数
rounded_data <- round(data, 1)
# 计算数据的累计和
cumulative_sum <- cumsum(data)
# 计算数据的累计乘积
cumulative_product <- cumprod(data)
# 计算数据的累计最小值
cumulative_min <- cummin(data)
# 计算数据的累计最大值
cumulative_max <- cummax(data)
# 去除重复的值
unique_data <- unique(data)
#依次输出运行结果
product_result;
max_index;
min_index;
reversed_data;
rounded_data;
cumulative_sum;
cumulative_product;
cumulative_min;
cumulative_max;
unique_data;
运行结果:
编写一个R函数,要求给定一个月的第一天是星期几和这个月的天数,即可输出这个月的月历。
create_calendar <- function(w, d) {
x <- c(1:42) # 创建一个包含1到42的向量,代表日历的42个格子
# 遍历42个格子
for (i in 1:42) {
if (i >= w && i < w + d) {
x[i] <- (i - w + 1) # 将日期填充到对应位置
} else {
x[i] <- NA # 非该月的日期用NA填充
}
}
A <- matrix(x, 6, 7, byrow = TRUE) # 将向量转换为6行7列的矩阵
colnames(A) <- c("Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun") # 设置列名
return(A)
}
# 调用函数,创建一个以星期二开始、包含31天的月份日历
calendar <- create_calendar(2, 31)
# 打印结果
print(calendar)
(个人总结,如有谬误或需要改进之处欢迎联系作者)
【预告:第3B章 | 安徽某高校《统计建模与R软件》期末复习(12月17日)】