R语言实战学习--回归

普通最小二乘回归(OLS)

OLS回归是通过预测变量的加权和来预测量化的因变量

简单线性回归

fit <- lm(weight~height,data = women)
summary(fit)     ## 模型拟合结果
fitted(fit)      ## 模型的拟合值
residuals(fit)   ## 拟合模型的残差

plot(women$height,women$weight,  ## 简单做图
     xlab = "Height",
     ylab = "Weight")
abline(fit)
anova(fit)   ##生成拟合模型的方差分析表

在这里插入图片描述

多项式回归

fit <- lm(weight~height+I(height^2),data = women)  ## 一元二次回归
summary(fit)

plot(women$height,women$weight,  ## 简单做图
     xlab = "Height",
     ylab = "Weight")
lines(women$height,fitted(fit))

fit <- lm(weight~height+I(height^2)+I(height^3),data = women)  ## 一元三次回归
summary(fit)
library(car)
scatterplot(weight~height,data = women,
            spread=FALSE,smoother.arg=list(lty=2),pch=19,
            main="Women Age 30-39",
            xlab = "Height",
            ylab = "Weight")

在这里插入图片描述

在这里插入图片描述

多元线性回归

state <- as.data.frame(state.x77[,c(5,1,3,2,7)])
cor(state)
library(car)

scatterplotMatrix(state,spread=FALSE,smoother.args=list(lty=2),
                  main="Scatter Plot Matrix")

fit <- lm(Murder~Population+ Illiteracy+Income+Frost,data = state)  ## 多元回归
summary(fit)

fit <- lm(mpg~hp+wt+hp:wt,data = mtcars)  ##有显著交互的回归
summary(fit)

library(effects)

plot(effect("hp:wt",fit,,list(wt=c(2.2,3.2,4.2))),mutiline=TRUE)

confint(fit)

交互作用

回归诊断

标准方法

fit <- lm(Murder~Population+ Illiteracy+Income+Frost,data = state)
summary(fit)

par(mfrow=c(2,2))
plot(fit)

在这里插入图片描述
左上表示残差分布图
右上表示正态分布检验,落在线上表示符合正态分布
左下表示方差齐性检验,随机分布则表示方差齐性
右下是残差与杠杆图,表示可以从中鉴别离群点、高杠杆点和强影响点

QQ图正态性检验

library(car)

fit <- lm(Murder~Population+ Illiteracy+Income+Frost,data = state)
summary(fit)
par(mfrow=c(1,1))
qqPlot(fit)

在这里插入图片描述

残差图

fit <- lm(Murder~Population+ Illiteracy+Income+Frost,data = state)
summary(fit)

residplot <- function(fit,nbreaks=10){
  z <- rstudent(fit)
  hist(z,breaks = nbreaks,freq = FALSE,
       xlab = "Studentized Residual",
       main = "Distribution of Errors")
  rug(jitter(z),col = "brown")
  curve(dnorm(x,mean = mean(z),sd=sd(z)),
        add = TRUE,col="blue",lwd=2)
  lines(density(z)$x,density(z)$y,
        col="red",lwd=2,lty=2)
  legend("topright",
         legend = c("Normal Curve","Kernel Density Curve"),
         lty = 1:2,col = c("blue","red"),cex = .7)
}
residplot(fit)

在这里插入图片描述

误差的独立性

fit <- lm(Murder~Population+ Illiteracy+Income+Frost,data = state)
summary(fit)
durbinWatsonTest(fit)

在这里插入图片描述

成分残差图(偏残差图) 线性

library(car)
fit <- lm(Murder~Population+ Illiteracy+Income+Frost,data = state)
summary(fit)
crPlots(fit)

在这里插入图片描述
线性模型对该模型似乎是合适的

同方差性

library(car)
fit <- lm(Murder~Population+ Illiteracy+Income+Frost,data = state)
summary(fit)

ncvTest(fit)
spreadLevelPlot(fit)

在这里插入图片描述

线性模型假设综合验证

library(gvlma)
fit <- lm(Murder~Population+ Illiteracy+Income+Frost,data = state)
summary(fit)

gvmodel <- gvlma(fit)
summary(gvmodel)

在这里插入图片描述

异常观测值

library(car)

fit <- lm(Murder~Population+ Illiteracy+Income+Frost,data = state)
summary(fit)
outlierTest(fit)

在这里插入图片描述

高杠杆值

library(car)

fit <- lm(Murder~Population+ Illiteracy+Income+Frost,data = state)
summary(fit)

hat.plot <- function(fit){
  p <- length(coefficients(fit))
  n <- length(fitted(fit))
  plot(hatvalues(fit),main = "Index Plot of Hat Value")
  abline(h=c(2,3)*p/n,col="red",lty=2)
  identify(1:n,hatvalues(fit),names(hatvalues(fit)))
}
hat.plot(fit)

强影响点

library(car)

fit <- lm(Murder~Population+ Illiteracy+Income+Frost,data = state)
summary(fit)

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

在这里插入图片描述

变量添加图

library(car)

fit <- lm(Murder~Population+ Illiteracy+Income+Frost,data = state)
summary(fit)

avPlots(fit,ask=FALSE,id.method="identity")

在这里插入图片描述

气泡图

library(car)

fit <- lm(Murder~Population+ Illiteracy+Income+Frost,data = state)
summary(fit)

influencePlot(fit,id.method="identity",main="Influence Plot",
              sub="Circle size is proportional to Cook's distance")

在这里插入图片描述

选择最佳模型

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

fit2 <- lm(Murder~Population+ Illiteracy,data = state)

anova(fit1,fit2)

AIC(fit1,fit2)  ## Aic 方法

逐步回归

library(MASS)

fit <- lm(Murder~Population+ Illiteracy+Income+Frost,data = state)

stepAIC(fit,direction = "backward")

全子集回归

library(leaps)

fit <- lm(Murder~Population+ Illiteracy+Income+Frost,data = state)

leaps <- regsubsets(Murder~Population+ Illiteracy+Income+Frost,data = state,nbest = 4)

plot(leaps,scale = "adjr2")

library(car)

subsets(leaps,statistic = "cp",
        main="Cp Plot for All Subsets Regression")
abline(1,1,lty=2,col="red")

在这里插入图片描述

k重交叉验证


shrinkage <- function(fit, k=10){
  require(bootstrap)
  theta.fit <- function(x,y){lsfit(x,y)}
  theta.predict <- function(fit,x){cbind(1,x)%*%fit$coef}
  x <- fit$model[,2:ncol(fit$model)]
  y <- fit$model[,1]
  results <- crossval(x, y, theta.fit, theta.predict, ngroup=k)
  r2 <- cor(y, fit$fitted.values)^2
  r2cv <- cor(y, results$cv.fit)^2
  cat("Original R-square =", r2, "\n")
  cat(k, "Fold Cross-Validated R-square =", r2cv, "\n")
  cat("Change =", r2-r2cv, "\n")
}
states <- as.data.frame(state.x77[, c("Murder", "Population", "Illiteracy", "Income", "Frost")])
fit <- lm(Murder ~ Population + Illiteracy + Income + Frost, data = states)
fit2<-lm(Murder~Population+Illiteracy,data=states)
shrinkage(fit)
shrinkage(fit2)#R平方减少得越少,预测则越精确。

在这里插入图片描述

相对重要性


states <- as.data.frame(state.x77[,c("Murder", "Population",
                                     "Illiteracy", "Income", "Frost")])
zstates <- as.data.frame(scale(states))
#scale()函数将数据标准化为均值为0、标准差为1的数据集,这样用R回归即可获得标准化的回归系数。
#(注意,scale()函数返回的是一个矩阵,而lm()函数要求一个数据框,你需要用一个中间步骤来转换一下。
zfit <- lm(Murder~Population + Income + Illiteracy + Frost, data=zstates)
coef(zfit)#Illiteracy是最重要的预测变量,而Frost是最不重要的
#相对重要性~相对权重法
relweights <- function(fit,...){
  R <- cor(fit$model)
  nvar <- ncol(R)
  rxx <- R[2:nvar, 2:nvar]
  rxy <- R[2:nvar, 1]
  svd <- eigen(rxx)
  evec <- svd$vectors
  ev <- svd$values
  delta <- diag(sqrt(ev))
  lambda <- evec %*% delta %*% t(evec)
  lambdasq <- lambda ^ 2
  beta <- solve(lambda) %*% rxy
  rsquare <- colSums(beta ^ 2)
  rawwgt <- lambdasq %*% beta ^ 2
  import <- (rawwgt / rsquare) * 100
  import <- as.data.frame(import)
  row.names(import) <- names(fit$model[2:nvar])
  names(import) <- "Weights"
  import <- import[order(import),1, drop=FALSE]
  dotchart(import$Weights, labels=row.names(import),
           xlab="% of R-Square", pch=19,
           main="Relative Importance of Predictor Variables",
           sub=paste("Total R-Square=", round(rsquare, digits=3)),
           ...)
  return(import)
}
states <- as.data.frame(state.x77[,c("Murder", "Population",
                                     "Illiteracy", "Income", "Frost")])
fit <- lm(Murder ~ Population + Illiteracy + Income + Frost, data=states)
relweights(fit, col="blue")#在这个模型中Illiteracy比Income相对更重要

在这里插入图片描述

  • 5
    点赞
  • 88
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
R语言实战笔记第九章介绍了方差分析的内容。方差分析是一种用于比较两个或多个组之间差异的统计方法。在R语言中,可以使用lm函数进行方差分析的回归拟合。lm函数的基本用法是: myfit <- lm(I(Y^(a))~x I(x^2) I(log(x)) var ... [-1],data=dataframe 其中,Y代表因变量,x代表自变量,a代表指数,var代表其他可能对模型有影响的变量。lm函数可以拟合回归模型并提供相关分析结果。 在方差分析中,还需要进行数据诊断,以确保模型的可靠性。其中几个重要的诊断包括异常观测值、离群点和高杠杆值点。异常观测值对于回归分析来说非常重要,可以通过Q-Q图和outlierTest函数来检测。离群点在Q-Q图中表示落在置信区间之外的点,需要删除后重新拟合并再次进行显著性检验。高杠杆值点是指在自变量因子空间中的离群点,可以通过帽子统计量来识别。一般来说,帽子统计量高于均值的2到3倍即可标记为高杠杆值点。 此外,方差分析还需要关注正态性。可以使用car包的qqplot函数绘制Q-Q图,并通过线的位置来判断数据是否服从正态分布。落在置信区间内为优,落在置信区间之外为异常点,需要进行处理。还可以通过绘制学生化残差的直方图和密度图来评估正态性。 综上所述,R语言实战第九章介绍了方差分析及其相关的数据诊断方法,包括异常观测值、离群点、高杠杆值点和正态性检验。这些方法可以用于分析数据的可靠性和模型的适应性。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [R语言实战笔记--第八章 OLS回归分析](https://blog.csdn.net/gdyflxw/article/details/53870535)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编码农夫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值