R语言实战笔记–第八章 OLS回归分析

标签(空格分隔): R语言 回归分析


  首先,是之前的文章,数理统计里面的简单回归分析,这里简单回顾一下:
  简单回归分析的原理:最小二乘法,即使回归函数与实际值之差的平方和最小。所以它在R中也称为OLS模型,它能实现的回归分析为简单线性回归、多项式回归以及多元线性回归。
  模型中的称谓:自变量、解释变量及预测变量为x,因变量、结果变量、效标变量及预测响应变量为y,用x,y解释对我们从小就学习y=a+bxy=a+bx的人来说是最容易理解不过了。
  使用OLS的前提条件:正态性(对于固定的x,y呈正态分布);独立性(各个y值之间独立);线性(y和x是线性关系,这也是简单回归分析需要先做相关性检验);同方差性(y的方差不变,不会因为x的水平不同而改变,意思即为,y是观察值,它应该是不会随机某个变量的改变而拿到我们的观察值跟着变化的)。
  
  然后是在R中的实现,R中实现OLS很简单,就一个函数lm(),其使用方法为:fit<-lm(formula,data),其中formula表达式的的形式为:Y~X1+X2+X3……+Xk,~左边为响应变量,右边为预测变量。对这个表达式,还有一个表来说明它的使用方式,如下:

符号 用途
~ 分隔符号,左边为响应变量,右边为解释变量。例如,要通过x、z和w预测y,代码为y ~ x + z + w
+ 分隔预测变量
: 表示预测变量的交互项。例如,要通过x、z及x与z的交互项预测y,代码为y ~ x + z + x:z
* 表示所有可能交互项的简洁方式。代码y~ x * z * w可展开为y ~ x + z + w + x:z + x:w + z:w + x:z:w
^ 表示交互项达到某个次数。代码y ~ (x + z + w)^2可展开为y ~ x + z + w + x:z + x:w + z:w
. 表示包含除因变量外的所有变量。例如,若一个数据框包含变量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上的回归,并强制直线通过原点
I() 从算术的角度来解释括号中的元素。例如,y ~ x + (z + w)^2将展开为y ~ x + z + w + z:w。相反, 代码y~ x + I((z + w)^2)将展开为y ~ x + h, h是一个由z和w的平方和创建的新变量
function 可以在表达式中用的数学函数。例如,log(y) ~ x + z + w表示通过x、z和w来预测log(y)

  
  还有一个表,是对拟合出来的模型进行处理的,比如summary(fit)可以展示拟合模型的详细结果,如下表:

函 数 用 途
summary() 展示拟合模型的详细结果
coefficients() 列出拟合模型的模型参数(截距项和斜率)
confint() 提供模型参数的置信区间(默认95%)
fitted() 列出拟合模型的预测值
residuals() 列出拟合模型的残差值
anova() 生成一个拟合模型的方差分析表,或者比较两个或更多拟合模型的方差分析表
vcov() 列出模型参数的协方差矩阵
AIC() 输出赤池信息统计量
plot() 生成评价拟合模型的诊断图
predict() 用拟合模型对新的数据集预测响应变量值

  
  前面是lm函数的基础,然而,在这章中所有的内容都需要理解,关键是里面的解释,总结一下各小节的关键点如下:
  
拟合回归
以一个综合的公式来表达如下:

myfit<-lm(I(Y^(a))~x+I(x^2)+I(log(x))+var+…+[-1],data=dataframe)

  可能会略显得复杂,但是,OLS回归的拟合其实就是这么一回事了,解释一下里面,myfit就是存放拟合结果的对象,lm是函数,I(Y^(a))~x+I(x^2)+……这个是公式,代表着Y可以是a次幕,具体可由后面的box-cox变换给出,I的意思在上面的公式表有描述,它代表的是一个算术式。如果只有Y~X+[-1],它就是一个简单的一元线性回归,加入I(x^2)就是多项式,多项式的最高次幕n代表着得到的函数曲线有n-1个弯,其它的log(x)就是变换了,但后面也提到,变量的变换要谨慎,用它里面的话来说,就是怎么解释自杀意念频率和抑郁程度的立方根的关系?还有一些如:,*之类就不加入这条公式了。
  注意的是,书中有交互项的回归函数一节中,Effect函数有变化,它的第三项在effect最新版变成了vcov,按原来的默认顺序是会出错的,必须明确指定第三个参数名字为xlevels才可以((即xlevels=list(wt=c(2.2,3.2,4.2)))
  
回归诊断
  用书上的一个例子来说明summary()的结果含义,再来开展诊断模式。见下面的注释:

Call:   #拟合公式
lm(formula = Murder ~ Population + Illiteracy + Income + Frost, data = states)
Residuals:  #残差的图基五数
Min      1Q  Median      3Q     Max
-4.7960 -1.6495 -0.0811  1.4815  7.6210 Coefficients:   #回归系数及相关Estimate Std. Error t value Pr(>|t|)   #系数估计值     标准误    t统计量     P值
(Intercept) 1.235e+00  3.866e+00   0.319   0.7510
Population  2.237e-04  9.052e-05   2.471   0.0173 *
Illiteracy  4.143e+00  8.744e-01   4.738 2.19e-05 ***
Income      6.442e-05  6.837e-04   0.094   0.9253
Frost       5.813e-04  1.005e-02   0.058   0.9541
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#上面一行标明在上面的回归系数后面跟着的***的含义,0-0.001之间为'***',0.001-0.001之间为'**'……,直观表示P值的范围
Residual standard error: 2.535 on 45 degrees of freedom #残差标准误
Multiple R-squared:  0.567, Adjusted R-squared:  0.5285 #决定系数R平方及修正R平方
F-statistic: 14.73 on 4 and 45 DF,  p-value: 9.133e-08 #F统计量

  summary()函数,后面的回归判断有更全面的方法,这里说一下summary的重要参数,回归系数,即Coefficcents下面的Estimate及Pr,Estimate是回归系数,其中(Intercept)是常数项,即截距,其它为各变量;Pr为当前系数的P值,P值决定此项变量对因变量的影响程度,或叫影响显著性,越小越显著;Multiple R-squared 决定系数R平方以及Adjusted R-squared修正R平方此项的意义为这个回归方程可以解释多少的实现y值(其实叫拟合优度,不过我认为直接叫实现y值会更加容易理解,如上一例为0.567,即56.7%,也就是说,这个回归方程可以解释56.7%的实际y值,可以换一种说法,叫有56.7%的实际y值落在了这个回归方程的可信范围内),修正R平方是经过修正之后的R平方,怎么修正看简单回归分析一文,这两个数越高越好,两个数越接近越好。F统计量为回归系数方差分析法里面的F统计量,越大越好,对应的P值越小越好。summary的函数介绍到此,但一般来说,这个函数最重要的就是系数估计值及R平方了,其它的参考性都不是很大。
  下面介绍专门用于对回归模型进行判断识别的函数,上面已经列出了部分相关函数了。
  标准方法,即使用base包进行诊断,主要用到plot图形方法诊断。plot图形生成四幅图,plot对回归模型的图形一共有6种,它自动生成的是123和5四幅,可以通过加入参数which=n来控制它生成哪幅图。标准方法只简单介绍自动生成的四幅图,在扩展的方法再详细说明。
  1、标准方法:
  先看图,左上角是残差拟合图,诊断x和y的线性关系,点均匀分布在横坐标两侧为优;右上角是正态Q-Q图,诊断x固定时,y是否呈正态分布,为残差标准化后的概率图,在一条45度的斜线上,点都在直线上且相对集中在(0,0)则为优;左下角为位置尺度图,诊断同方差性,随机分散在水平线两侧为优;右下角为残差杠杆图,诊断异常点,主要体现离群点、高杠杆值点和强影响点,这里也说一下,在不能安装其它R包的前提下确定这些异常点,看这张图还是能粗略看出点什么的,比如离得特别远的,在虚线以外的那些点。
  
  2、改进的方法:
 R语言实战中主要是使用car包,下面先看一下它的函数有哪些:

函 数 目 的
qqPlot() 分位数比较图
durbinWatsonTest() 对误差自相关性做Durbin-Watson检验
crPlots() 成分与残差图
ncvTest() 对非恒定的误差方差做得分检验
spreadLevelPlot() 分散水平检验
outlierTest() Bonferroni离群点检验
avPlots() 添加的变量图形
inluencePlot() 回归影响图
scatterplot() 增强的散点图
scatterplotMatrix() 增强的散点图矩阵
vif() 方差膨胀因子

  以OLS回归模型的四大需求来逐个诊断,函数的用法都不写了,直接看help吧,越用越发现,help的强大,知道这个函数及其用法就得了:
  正态性:使用car包的qqplot可以作出一个45度线及其置信区间的图,线落在置信区间为优。落在置信区间之外为异常点,我们需要对异常点进行处理(包括分析其出现的原因,修正,剔除等),另外,R语言实战还介绍了一个学生化残差的函数,以直方图及密度图显示Q-Q图,代码如下:

residplot <- function(fit, nbreaks=10) {#标准化残差zz <- 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,nbreaks=n)  #调用函数,fit为回归模型lm(),nbreaks为直方图分组数

  误差的独立性,car包主要提供的是Durbin-Watson检验(函数durbinWatsonTest(),一种检测样本是否存在自相关关系的方法,其原假设为独立,即不相关,当p<显著水平时,显著拒绝原假设)。其它书上介绍了误差自相关时的解决方案:误差不独立,可以看作是自相关,也叫序列相关,一般来说,有三种原因导致其产生,1)模型的数学形式错误,可以通过利用残差对较高次幂的解释变量进行回归,然后做DW检验,如果序列相关性消失,则为数学形式错误,2)经济变量的惯性,比如时间序列,3)回归模型中略去了带有自相关的重要解释变量,可以通过利用残差对可能影响但未列入模型的解释变量进行回归,并做显著性检验,若显著,则则列入模型。若误差存在自相关,并且排除了上述因素1和因素3后,可以使用orcutt包的cochrane.orcutt(lmobject)函数来进行求解其回归系数。
  
  线性,成份残差图/偏残差图,使用crPlot来画出残差与各成份(即变量)的散点图,实线与虚线拟合度越高越好,即实线最好能与虚线重合。
  
  同方差性,ncvTest()函数将生成一个卡方检验量,零假设为方差不变,即P值小于显著水平时,显著拒绝方差不变的零假设。另外,car包还给出了一个Suggested power transformation(函数为spreadLevelPlot),建议幂次变换值λ\lambda,使YλY^{\lambda}得到一个较为平稳的误差方差,可若建议为0,则使用对数变换,若为0.5,则使用y√\sqrt{y}代替y。建议以0.5为一进位,spreadLevelPlot给出了一张图,若图形的线非水平,,则可以按照建议值进行y值的幂次变换。另外,异方差的克服也可以通过Glejser方法进行检验并得到残差绝对值与变量的回归函数关系式,然后对现有回归方程中所有变量均除这个关系式结果得到新解释变量观测值,利用新观测值进行回归拟合即可。
  
  综合验证,gvlma包给出了一个综合验证函数gvlma()上述假设的综合验证结果(acceptable/NOT satisfied)若出现不满意,则需要逐个排除。
  
  多重共线性,当自变量之间存在极高相关性时,将会出现整体的F检验非常显著,但各个回归系数却不显著的情况,要检测此值,可以使用方差膨胀因子VIF进行检测,一般来说vif−−−√>2\sqrt{vif}>2就表明存在多重共线性问题。多重共线性的克服可以通过逐步回归方法(setp()函数)对变量的筛选来进行,但逐步回归方法会对变量进行删除,会有一定程度的失真,另一种方法叫岭回归,它可以在不删除变量的基础上,选择适当的岭参数对回归系数进行修正,使岭估计相对稳定,函数为MASS包中的lm.ridge()函数,相对lm()函数多出了一个岭参数lambda的设置,岭迹法就是把lambda参数设置为序列,并画出来,选择其稳定点的具体参数进行代入计算,选择稳定点可以使用select()函数进行更精确的选择(有HKB、L-W和GCV三种方法,具体先哪个可以分别测试),方法如下:

library(MASS)
lm.ridge(Y~X,data=data)#未设置岭参数时,岭回归与lm结果一样
plot(lm.ridge(Y~X,data=data,lambda=seq(0,1,0.0001)))#画岭迹图
select(lm.ridge(Y~X,data=data,lambda=seq(0,1,0.0001)))#选岭参数
lm.ridge(Y~X,data=data,lambda=0.0038)#根据选择的具体参数代入计算

  
异常观测值
  异常值,对回归分析来说,它的价值其实不亚于回归函数,分析它可以知道我们的数据是否可靠,是否存在未考虑到的情况等等,需要重视异常值。
  离群点:Q-Q图中,落在置信区间外的点可以称之为离群点,它意味着有较大的残差值,Q-Q图是一种分析方法,另外,car包还提供一个outlierTest(fit)函数来检测离群点,注意的是,它提供的是单个最大值的显著性检验,若出现离群值,必须删除后再进行回归拟合,然后再进行一次outlierTest,若检验显著(p<0.05),则再删除再拟合再测试~
  高杠杆值点:自变量因子空间中的离群点,可以使用帽子统计量来识别,一般来说,其帽子统计量高于均值的2到3倍即可标记为高杠杆值点。R语言实战中给出函数:

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

  两条虚线分别为2倍和3倍均值帽子统计量水平线,高于这两条线可考虑高杠杆值点。
  强影响点
  就是,若把这个点删除,就会对模型造成巨大影响的点,有两个方法,一个是Cook’s D统计量,一个是变量添加图,Cook’s D方法为,一般来说,若Cook’s D距离大于4/(n-k-1)则可以判断为强影响点,但R语言实战中标记出,D统计量大于1的时候更具一般性。其中,n为样本数,k为回归函数的变量数(含常数项),计算图形函数为plot(fit,which=4),没错,就是plot图形函数,之前说过,对回归模型lm,plot有1到6六个图形,只是显示了1:3,5这四个,其中第4个就是Cook’s D图形,再使用abliine添加4/(n-k-1)水平线上去就可以了。变量添加图,百度找不到合理的解释,R语言实战中也并没有很明确的解释这个图是怎么用的,个人理解是,若图中一个点离群,且删掉它之后,其直线斜率有可能改变正负,则这个点为强影响点,不知道对不对。
  
  综合图,car包提供了一个图,可以一次性地把这三个点识别出来,函数为influencePlot(fit),可以加入id.method=”identify”参数来使用鼠标选择显示点标签。
  
改进方法
  主要是改进模型的方法三个类型:删除,分为删除观测点(主要是离群点)和删除变量(主要是多重共线性变量),直接删除后再进行回归模型拟即可;变量变换,分为响应变量变换(y)和预测变量变换(x),当回归模型违反正态假设时,可以进行响应变量变换来改善其正态性,使用car包中的powerTranform(变量值)函数来进行Box-Cox正态变换来进行,是否需要可以看结果中的p值(<0.05则为需要进行变换),当回归模型违反线性假设时,可以使用boxTidwell(回归模型中的参数内容,即去掉lm()之后的内容)函数来进行识别,同样,需要看其中的p值。响应变量(y)的变换同样也可以改善方差齐性,此点之前的同方差性有说明,可以返回查看。尝试使用其它方法,当数据不满足OLS假设前提时,不需要使用其它更加合理的方法进行回归,如出现多重共线性时可以使用岭回归,存在离群点/强影响点时使用稳健回归,存在非正态性时,使用非参数回归,存在非线性时尝试非线性回归,如果违反误差独立性假设,还能使用那些专门研究误差结构的模型,比如时间序列或多层次回归模型,最后,还可以使用广泛应用的广义线性模型,它能适用许多OLS回归假设不成立的情况。
  
最佳回归模型
  最佳只是相对的,回归模型的选择主要通过模型比较以及变量选择来进行。
  模型比较,R语言实战给出两种方法,一个是利用方差anova进行嵌套比较,另一个是使用AIC(赤池信息准则)来进行比较。anova嵌套比较是把变量少的模型嵌套在变量多的模型中,利用p值检验其它变量(即不在变量少的模型但在变量多的模型中的变量)是否需要添加,简单打个比方,模型1为y~1+2+3,模型2为y~1+2+3+4,则为模型1嵌套在模型2中(注:anova(模型2,模型1)),检测的是4是否需要添加到模型中,p值显著则表明需要添加;AIC方式,它不需要要求嵌套,可心直接使用AIC(fit)来进行计分,所得结果越小越好(AIC=2k-2ln(L),k为模型的因变量数量,ln(L)为对数似然函数,即为因变量越少越,似然函数越大,AIC值越小)。
  变量选择,分为逐步回归和全子集回归,逐步回归有向前,向后,及向前向后,具体可看回归分析,R中使用的是MASS包上的stepAIC函数,参数direction可以决定使用“forward、backward、both”三种方法,以AIC值决定选用哪种;全子集回归使用leaps包中的regsubsets()函数,通过R平方,修正R平方以及Mallow Cp统计量,得到的结果可以使用leaps的plot函数(此处注意,是leaps的plot函数,可以使用leaps::plot来指定,避免后续出错)进行绘图,scale参数可以指定以什么统计量(R平方,修正R平方等)作为纵坐标。也可心使用car包中的subsets()函数进行绘制。leaps::plot画出来的是一幅灰度方格图,从底部向上看,左侧为统计量值,例如书上是以修正R平方为纵坐标的,横坐标是所有变量(含截距),图中的同一行的方格表示它正在使用对应的变量。同一行的两个方格表示它正在使用方格对应变量组成的回归函数的修正R平方值为多少,对修正R平方来说,越高越好。subsets画出来的函数需要添加一条截距和斜率均为1的直线,而图中标记越接近这条直线越好。
  
深层次分析
  最后,书中对OLS模型给出了交叉验证以及变量相对重要性来进一步评价模型的合理性及变量的相对重要性。
  交叉验证,给出代码清单,利用bootstrap包中的crossval()函数来进行交叉验证,即使用样本中部分数据做回归估计,然后用另一部分数据去预测,验证其回归方程的好坏,对比前后R平方减少情况,减少得越少越好。
  变量相对重要性,书中给出两种方法,但是,这两种方法得到的结果只有影响最大的一样,其它不一样,这让我觉得有点纠结,从网上找到的资料来看,利用标准化回归系数来衡量为最基础,最简单的方法,而且这个方法不受其它因素的影响,可以直接使用,别一种方法是相对权重,但是得出的结果却和标准回归系数法有较大出入,个人倾向前一种方法。
  R语言的简单回归章节至此结束,这个回归学了很久,中间也有一些事情打断了学习,但是,在学习的过程中,又重温了一次统计学的简单回归,发现,很多东西你不用就会忘记,而且也有很多未了解的知识,有很多知识了解了也不知道是怎么一回事,期望后续的进一步学习能补全缺失的知识点。

R语言实战笔记--第八章 OLS回归分析相关推荐

  1. 《R语言实战》第八章之回归分析图形

    回归分析图形 回归分析分为简单回归与复杂回归 1 : 简单线性回归即:模型中只包含一个因变量和一个自变量,有时候也会包含多项式, 这个图形描述了身高与体重的线性关系,这也是一个多项式图形 2:当我们的 ...

  2. R语言实战笔记--第十五章 处理缺失数据

    R语言实战笔记–第十五章 处理缺失数据 标签(空格分隔): R语言 处理缺失数据 VIM mice 缺失值(NA),是导致我们计算错误的一大来源,处理缺失数据在实际的应用中有着较为重要的作用. 基本方 ...

  3. R语言实战笔记--第十四章 主成分和因子分析

    R语言实战笔记–第十四章 主成分和因子分析 标签(空格分隔): R语言 主成分分析 因子分析 原理及区别 主成分分析与因子分析很接近,其目的均是为了降维,以更简洁的数据去解释结果,但这两种方法其实是相 ...

  4. R语言实战笔记--第十二章 重抽样(置换检验)与自助法

    R语言实战笔记–第十二章 重抽样(置换检验)与自助法 标签(空格分隔): R语言 重抽样 自助法 置换检验 置换检验 双样本均值检验的时候,假设检验的方法就是,检查正态性.独立性.方差齐性,分别对应的 ...

  5. R语言实战笔记--第四五章 数据管理

    R语言实战笔记–第四&五章 数据管理 标签(空格分隔): R语言 第四.第五章都是说的数据管理,合并在一起做个总结,在个人看来,数据管理是一件非常繁琐的事情,但是,每个统计的前提都是一个合适的 ...

  6. R语言实战笔记--第九章 方差分析

    R语言实战笔记–第九章 方差分析 标签(空格分隔): R语言 方差分析 术语 组间因子,组内因子,水平:组间因子和组同因子的区别是,组间因子对所有测试对象进行分组,而组内因子则把所有测试对象归为同一组 ...

  7. R语言学习笔记(六)回归分析

    文章目录 写在前面 普通最小二乘(OLS)回归法 正态假设 简单线性回归 多项式回归 多元线性回归 有交互项的多元线性回归 小结 回归诊断 标准方法 综合验证方法 多重共线性 广义线性回归--Logi ...

  8. R语言mad(c(1 2 3 4)),R语言--数据管理-R语言实战笔记-第四五章

    第四.第五章都是说的数据管理,合并在一起做个总结,在个人看来,数据管理是一件非常繁琐的事情,但是,每个统计的前提都是一个合适的数据样本,对的,"合适",做到合适可不是一个简单的事情 ...

  9. 《R语言实战笔记》第一章:R语言介绍

    第一章:R语言介绍 1.3.2获取帮助 1.3.3 工作空间 注意:函数setwd()不会自动创建一个不存在的目录.可以先使用函数dir.create()来创建新目录,然后使用setwd()将工作目录 ...

最新文章

  1. SBB:增温掩盖不同形态氮素对青藏高原草地微生物群落的作用
  2. SpringBoot如何自动生成实体类和Dao层以及映射文件(mybatis generator 自动生成代码)
  3. qt 中如何检测是否按下键盘(很实用)
  4. iOS10 优化APP首次安装网络权限提示方案
  5. oppo5.0以上系统怎么样不Root激活Xposed框架的经验
  6. tensorflow 版本列表,如何找到我的系统中安装了哪个版本的TensorFlow?
  7. 如何打造标签式IE浏览器 (共享源码)
  8. webpack安装_初识webpack
  9. python时间格式毫秒_Python获取秒级时间戳与毫秒级时间戳
  10. linux查询文件md5sum,Linux下通过md5sum生成MD5文件校验MD5
  11. 可以作用c语言常量的是,正确的C语言常量是什么?
  12. JZOJ5857. 【NOIP提高组模拟A组2018.9.8】没有上司的舞会
  13. 第三方支付——微信web端支付(java)
  14. adb常用的命令【杭州多测师_王sir】【杭州多测师】
  15. Mininet系列实验(二):Mininet可视化应用
  16. FireBird Embedded学习日记
  17. 【教程汇总】英文关键词发掘与整理
  18. 电脑组成部件介绍图解之电脑由哪些部件组成?各个部件作用又是什么 ?主要功能是什么?
  19. 基于JavaScript的幸运大转盘
  20. 多张图片合成一份PDF(不使用其他软件)

热门文章

  1. fstab与mtab
  2. [PTA] 7-5 输出倒三角图案
  3. 【百度云智峰会】数字营销新革命
  4. python从小白到大牛视频资源下载_Python从小白到大牛 PDF 下载
  5. 初入产品一直坚持做的事情
  6. A股史上唯一不会坑人的MACD金叉战法,值得你收藏
  7. 历史or技术科普(3)认识UNIX System V
  8. STM32L051C8T6 HAL库 输入捕获进行超声波测距 案例
  9. 从motan看RPC框架设计
  10. texstudio 使用方法_如何使用 TeX Live 和 TeXstudio 操作 LaTeX?