统计建模是数据科学中至关重要的一部分,帮助分析和预测数据中的趋势与模式。在数据科学中,常用的统计模型有回归分析、时间序列分析、分类模型、聚类模型等,每种模型有其独特的应用场景。在R语言中,我们可以通过丰富的统计包,如lm()进行线性回归分析,glm()用于广义线性模型,arima()进行时间序列建模等。这些模型能够帮助我们从数据中提取信息并做出科学决策,成为数据分析中的强大工具。
一、线性回归
线性回归是最基本也是最常用的统计模型之一,用于分析因变量与一个或多个自变量之间的线性关系。
代码语言:javascript复制# 加载数据
data(mtcars)
# 建立线性回归模型
model <- lm(mpg ~ wt + hp, data = mtcars)
# 查看模型摘要
summary(model)
# 可视化
plot(mtcars$wt, mtcars$mpg, main = "Weight vs MPG", xlab = "Weight", ylab = "MPG")
abline(lm(mpg ~ wt, data = mtcars), col = "red")
二、逻辑回归
逻辑回归用于预测二分类结果,常用于分类问题。
代码语言:javascript复制# 加载数据
data(mtcars)
# 创建二分类变量
mtcars$am_factor <- factor(mtcars$am, levels = c(0, 1), labels = c("Automatic", "Manual"))
# 建立逻辑回归模型
model <- glm(am_factor ~ wt + hp, data = mtcars, family = "binomial")
# 查看模型摘要
summary(model)
# 预测
predictions <- predict(model, type = "response")三、多项式回归
多项式回归用于建模非线性关系。
代码语言:javascript复制# 创建多项式特征
mtcars$wt_squared <- mtcars$wt^2
# 建立多项式回归模型
model <- lm(mpg ~ wt + wt_squared, data = mtcars)
# 查看模型摘要
summary(model)
# 可视化
plot(mtcars$wt, mtcars$mpg, main = "Weight vs MPG (Polynomial)", xlab = "Weight", ylab = "MPG")
curve(coef(model)[1] + coef(model)[2]*x + coef(model)[3]*x^2, add = TRUE, col = "red")四、泊松回归
泊松回归用于建模计数数据。
代码语言:javascript复制# 加载数据
data(warpbreaks)
# 建立泊松回归模型
model <- glm(breaks ~ wool + tension, data = warpbreaks, family = poisson)
# 查看模型摘要
summary(model)
五、负二项回归
负二项回归用于处理过度离散的计数数据。
代码语言:javascript复制library(MASS)
# 建立负二项回归模型
model <- glm.nb(breaks ~ wool + tension, data = warpbreaks)
# 查看模型摘要
summary(model)
六、贝叶斯回归
贝叶斯线性回归(Bayesian Linear Regression)使用贝叶斯方法对模型的参数进行推断,与传统的线性回归方法不同,贝叶斯方法为参数提供了概率分布而不是点估计。这意味着贝叶斯方法能够处理模型参数的不确定性,提供更为丰富的信息。
代码语言:javascript复制library(rstanarm)
# 加载数据
data(mtcars)
head(mtcars)
# 使用 rstanarm 进行贝叶斯线性回归
# 我们使用 mpg 作为目标变量,disp 和 wt 作为自变量
bayes_model <- stan_glm(mpg ~ disp + wt, data = mtcars,
family = gaussian(),
prior = normal(0, 10), # 设置先验分布
prior_intercept = normal(0, 10),
chains = 4, iter = 2000)
# 查看模型摘要
summary(bayes_model)
# 预测
predictions <- predict(bayes_model, newdata = mtcars)
# 可视化预测结果
plot(mtcars$mpg, predictions, main = "贝叶斯线性回归预测 vs 真实值",
xlab = "真实值", ylab = "预测值")
abline(0, 1, col = "red")
七、生存分析
生存分析用于分析时间到事件数据。
代码语言:javascript复制# 安装并加载必要的包
install.packages("survival")
install.packages("survminer")
library(survival)
library(survminer)
# 加载示例数据集
data(lung)
head(lung)
# 创建生存对象
surv_obj <- Surv(time = lung$time, event = lung$status)
print(surv_obj)
# 拟合 Kaplan-Meier 生存曲线(整体数据)
fit <- survfit(surv_obj ~ 1, data = lung)
summary(fit)
# 绘制 Kaplan-Meier 生存曲线
ggsurvplot(fit, data = lung, conf.int = TRUE, pval = TRUE,
risk.table = TRUE, surv.median.line = "hv",
ggtheme = theme_minimal())
# 按变量(性别 sex)分组进行生存分析
fit_sex <- survfit(Surv(time, status) ~ sex, data = lung)
ggsurvplot(fit_sex, data = lung, pval = TRUE, conf.int = TRUE,
risk.table = TRUE, ggtheme = theme_minimal())
# Cox 比例风险回归模型
cox_model <- coxph(Surv(time, status) ~ age + sex + ph.ecog, data = lung)
summary(cox_model)
# 绘制 Cox 回归森林图
ggforest(cox_model, data = lung)
八、决策树
决策树是一种直观的机器学习模型,常用于分类和回归问题。
代码语言:javascript复制# 安装并加载必要的包
install.packages("rpart")
install.packages("rpart.plot")
library(rpart)
library(rpart.plot)
# 加载示例数据集 iris
data(iris)
head(iris)
# 构建决策树模型(分类)
tree_model <- rpart(Species ~ ., data = iris, method = "class")
# 可视化决策树
rpart.plot(tree_model, type = 3, extra = 101, fallen.leaves = TRUE)
# 进行预测(使用训练数据集)
predictions <- predict(tree_model, iris, type = "class")
# 计算模型准确率
accuracy <- sum(predictions == iris$Species) / nrow(iris)
print(paste("模型准确率:", round(accuracy * 100, 2), "%"))
# 构建决策树回归模型
set.seed(123)
data(mtcars)
tree_reg <- rpart(mpg ~ ., data = mtcars, method = "anova")
# 可视化回归决策树
rpart.plot(tree_reg, type = 3, extra = 101, fallen.leaves = TRUE)
# 进行预测
pred_mpg <- predict(tree_reg, mtcars)
# 输出预测值和实际值的对比
comparison <- data.frame(Actual = mtcars$mpg, Predicted = pred_mpg)
print(head(comparison))
九、随机森林
(1) 使用随机森林进行分类
我们使用iris数据集进行分类任务,预测鸢尾花的种类(Species)。
代码语言:javascript复制# 加载示例数据集
data(iris)
head(iris)
# 构建随机森林分类模型
rf_model_class <- randomForest(Species ~ ., data = iris, ntree = 100)
# 查看模型摘要
print(rf_model_class)
# 绘制误差率图
plot(rf_model_class)
# 进行预测
pred_class <- predict(rf_model_class, iris)
# 计算准确率
accuracy_class <- sum(pred_class == iris$Species) / nrow(iris)
print(paste("分类模型准确率:", round(accuracy_class * 100, 2), "%"))
(2) 使用随机森林进行回归
我们使用mtcars数据集进行回归任务,预测mpg(汽车的每加仑油行驶的英里数) 。
代码语言:javascript复制# 加载示例数据集
data(mtcars)
head(mtcars)
# 构建随机森林回归模型
rf_model_reg <- randomForest(mpg ~ ., data = mtcars, ntree = 100)
# 查看模型摘要
print(rf_model_reg)
# 绘制误差率图
plot(rf_model_reg)
# 进行预测
pred_reg <- predict(rf_model_reg, mtcars)
# 输出预测值和实际值的对比
comparison_reg <- data.frame(Actual = mtcars$mpg, Predicted = pred_reg)
print(head(comparison_reg))
# 计算回归模型的R平方值
rsq_reg <- cor(mtcars$mpg, pred_reg)^2
print(paste("回归模型R平方值:", round(rsq_reg, 2)))
十、支持向量机
SVM是一种强大的分类算法,特别适合处理高维数据。
代码语言:javascript复制# 加载示例数据集
data(iris)
head(iris)
# 构建支持向量机分类模型
svm_model <- svm(Species ~ ., data = iris, kernel = "radial", cost = 1, scale = TRUE)
# 查看模型摘要
summary(svm_model)
# 进行预测
pred_svm <- predict(svm_model, iris)
# 计算准确率
accuracy_svm <- sum(pred_svm == iris$Species) / nrow(iris)
print(paste("SVM分类模型准确率:", round(accuracy_svm * 100, 2), "%"))
十一、神经网络
神经网络是深度学习的基础,能够处理复杂的模式识别任务。
代码语言:javascript复制# 加载数据
data(iris)
head(iris)
# 将因子变量转换为二进制指示变量(one-hot encoding)
iris$Species <- as.numeric(iris$Species)
# 划分训练集和测试集
set.seed(123)
index <- sample(1:nrow(iris), 0.7 * nrow(iris))
train_data <- iris[index, ]
test_data <- iris[-index, ]
# 构建神经网络模型
nn_model <- neuralnet(Species ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width,
data = train_data, hidden = c(5, 3), linear.output = FALSE)
# 绘制神经网络结构
plot(nn_model)
# 进行预测
nn_pred <- compute(nn_model, test_data[, -5])$net.result
nn_pred_class <- round(nn_pred) # 取整获得分类结果
# 计算准确率
accuracy_nn <- sum(nn_pred_class == test_data$Species) / nrow(test_data)
print(paste("神经网络分类模型准确率:", round(accuracy_nn * 100, 2), "%"))十二、广义线性模型 (GLM)
GLM是线性模型的扩展,可以处理非正态分布的响应变量。
代码语言:javascript复制# 建立GLM模型 (以逻辑回归为例)
model <- glm(am ~ wt + hp, data = mtcars, family = binomial)
# 查看模型摘要
summary(model)
十三、广义加性模型 (GAM)
GAM允许预测变量与响应变量之间的非线性关系。
代码语言:javascript复制# 加载必要包
library(mgcv)
# 构造数据集:这里我们生成 32 个样本
set.seed(123) # 保证结果可重复
n <- 32
mpg <- rnorm(n, mean = 20, sd = 5) # mpg:均值20,标准差5的正态分布
wt <- rnorm(n, mean = 3, sd = 0.5) # wt:均值3,标准差0.5的正态分布
hp <- rnorm(n, mean = 150, sd = 30) # hp:均值150,标准差30的正态分布
# 创建数据框,命名为 mtcars(与内置数据集同名)
mtcars <- data.frame(mpg = mpg, wt = wt, hp = hp)
# 建立 GAM 模型
model <- gam(mpg ~ s(wt) + s(hp), data = mtcars)
# 查看模型摘要
summary(model)
# 可视化模型中平滑函数的估计
plot(model)
十四、主成分分析 (PCA)
PCA用于降维和探索性数据分析。
代码语言:javascript复制# 执行PCA
pca_result <- prcomp(mtcars[, c("mpg", "disp", "hp", "drat", "wt")], scale. = TRUE)
# 查看结果
summary(pca_result)
# 可视化
biplot(pca_result)
十五、因子分析
因子分析用于探索变量之间的潜在结构。
代码语言:javascript复制library(psych)
# 执行因子分析
fa_result <- fa(mtcars[, c("mpg", "disp", "hp", "drat", "wt")], nfactors = 2, rotate = "varimax")
# 查看结果
print(fa_result)
# 可视化
fa.diagram(fa_result)
十六、聚类分析 (K-means)
K-means是一种常用的聚类算法,用于将数据分成K个组。
代码语言:javascript复制# 执行K-means聚类
kmeans_result <- kmeans(mtcars[, c("mpg", "wt")], centers = 3)
# 可视化结果
plot(mtcars$wt, mtcars$mpg, col = kmeans_result$cluster, pch = 19,
main = "K-means Clustering", xlab = "Weight", ylab = "MPG")
points(kmeans_result$centers[, c("wt", "mpg")], col = 1:3, pch = 8, cex = 2)十七、层次聚类
层次聚类创建一个树状结构来表示数据的聚类。
代码语言:javascript复制# 计算距离矩阵
dist_matrix <- dist(mtcars[, c("mpg", "wt")])
# 执行层次聚类
hc_result <- hclust(dist_matrix, method = "ward.D2")
# 可视化结果
plot(hc_result, main = "Hierarchical Clustering Dendrogram", xlab = "", sub = "")十八、时间序列分析 (ARIMA)
ARIMA模型用于分析和预测时间序列数据。
代码语言:javascript复制library(forecast)
# 创建时间序列对象
ts_data <- ts(AirPassengers, frequency = 12)
# 拟合ARIMA模型
model <- auto.arima(ts_data)
# 查看模型摘要
summary(model)
# 预测
forecast_result <- forecast(model, h = 12)
plot(forecast_result)
十九、时间序列交叉验证
使用 caret 包进行时间序列交叉验证。
代码语言:javascript复制# 安装和加载必要的包
install.packages("caret")
library(caret)
library(tseries)
# 示例数据
data(AirPassengers)
ts_data <- AirPassengers
# 定义时间序列的长度
train_size <- length(ts_data) * 0.8
train_data <- ts_data[1:train_size]
test_data <- ts_data[(train_size + 1):length(ts_data)]
# 设置交叉验证的参数
train_control <- trainControl(method = "timeslice",
initialWindow = 36, # 初始训练窗口大小(例如36个月)
horizon = 12, # 每次验证期为12个月
fixedWindow = TRUE) # 固定窗口(滚动窗口)
# 使用 ARIMA 模型进行训练和验证
model <- train(train_data ~ 1,
method = "auto",
trControl = train_control)
# 查看模型结果
print(model)
使用tscv包进行时间序列交叉验证
代码语言:javascript复制# 安装 tsccv 包
install.packages("tscv")
library(tscv)
# 示例数据
data(AirPassengers)
ts_data <- AirPassengers
# 定义时间序列交叉验证设置
cv_results <- tscv(ts_data,
k = 5, # 将数据集分为5个时间段
window_type = "rolling", # 使用滚动窗口
horizon = 12, # 每次验证期为12个月
initial_window = 36) # 初始窗口为36个月
# 查看交叉验证结果
print(cv_results)
二十、多层次模型
多层次模型(也称为混合效应模型,Mixed Effects Model)用于分析具有分层结构的数据。
代码语言:javascript复制# 多层次模型(Multilevel Models, MLM)在 R 中的应用
# 加载必要的包
install.packages("lme4")
library(lme4)
install.packages("nlme")
library(nlme)
# 生成示例数据
set.seed(123)
school_data <- data.frame(
score = rnorm(1000, mean = 75, sd = 10), # 学生成绩
teacher = factor(rep(1:50, each = 20)), # 50 名教师,每位教师教授 20 名学生
school = factor(rep(1:10, each = 100)), # 10 所学校,每所学校有 100 名学生
study_hours = rnorm(1000, mean = 5, sd = 1) # 学习时间
)
# 1. 仅包含随机截距的模型
model1 <- lmer(score ~ (1 | school) + (1 | teacher), data = school_data)
summary(model1)
# 2. 添加固定效应变量 study_hours
model2 <- lmer(score ~ study_hours + (1 | school) + (1 | teacher), data = school_data)
summary(model2)
# 3. 允许斜率在学校层面随机变化
model3 <- lmer(score ~ study_hours + (study_hours | school) + (1 | teacher), data = school_data)
summary(model3)
# 4. 使用 nlme 包进行建模
model_nlme <- lme(score ~ study_hours, random = ~1 | school/teacher, data = school_data)
summary(model_nlme)
# 5. 比较模型的 AIC 值
AIC(model1, model2, model3)
admin