基础方法 | 用R语言完成量化论文全流程示例!附超详细R脚本
Posted 来点方法
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基础方法 | 用R语言完成量化论文全流程示例!附超详细R脚本相关的知识,希望对你有一定的参考价值。
基础方法
♪
Method
R语言的优点
对于有一定数据分析基础的朋友们来说,要入门R语言并不是十分困难的。但是这毕竟是一门专业性很强的技术,我们当然希望投入精力掌握R语言之后能够得到相应的回报。
在这方面,R语言绝不会让人失望,因为它拥有一系列让人印象深刻的优点。
1,相较于其他数据分析软件,R拥有首屈一指的制图功能。如果希望对复杂的数据进行可视化,那么R可以提供最为全面而强大的一系列功能。
2, R在数据探索和分析这方面也是一个灵活而强大的平台,任意一个分析步骤的结果均可被轻松保存、操作,并作为进一步分析的元素。
3, R能够从众多的来源中获取数据并且将其转化为R可用的形式。数据库,文本文件,网页媒体乃至地图等等都可以成为R获取数据并进行分析的来源。
4, R的开源性质使得R在囊括了各种经典的统计方法之外,还能够提供丰富的创新方法。使用和开发R语言的人们组成了一个活跃的社区,种种新奇的、有时候非常小众的数据处理方法会很快地被开发出来,并且可以完全免费地下载相关的包(package)。
5,(关于R包)包是R函数、数据、预编译代码以一种定义完善的格式组成的集合。安装并且加载了包之后,我们就可以简便地使用它提供的命令以及一些自带的数据。R最基础的功能正是有R自带的一系列默认包提供的,加载了我们需要的其他扩展包之后,R几乎无所不能。
(需要安装“haven”包:使用命令:install.packages("haven") )
首先要通过下列命令设定我们的工作文档。
setwd("D:/案例") #重新设定工作文档
我们可以将数据文件存放在这里方便调用。设定完毕后,今后的数据处理过程中产生的文件都会自动存储在这一路径下。
网上的CGSS数据往往是STATA或者SPSS对应的版本,所以用haven包中的相应命令来读取。
library("haven")#加载R包,之后才能使用相关的命令
CGSS<-read_dta("cgss2015.dta")#读取数据并且保存在名字为“CGSS”的对象中。
这样,我们就将CGSS2015年的数据读取完毕。
我们在操作的过程中,可以随时保存我们操作的结果。
save.image("D:/案例/save.RData")
使用这一命令可以将当前所有的数据以及我们构建的模型等对象统一保存在相应的文件中。
例如:我们最关心的两个变量一个是收入,一个是主观幸福感,我们可以先查看一下变量的基本情况
(需要安装“psych”包:使用命令:install.packages("psych") )
在本案例中,我们最关心的两个变量就是收入以及主观幸福感。我们可以先大致查看一下变量的基本情况
主观幸福感是一个分类变量,用table函数可以得到它的值与对应个数。
table(CGSS$a36)
用psych包中的describe函数可以得到更详细的内容。
library("psych")
describe(CGSS$a36)#查看变量a36
describe(CGSS$a8a)#查看变量a8a
(需要安装“dplyr”包:使用命令:install.packages("dplyr") )
(需要安装“car”包:使用命令:install.packages("car") )
(需要安装“psych”包:使用命令:install.packages("psych ") )
下面,我们将进入数据分析过程中最关键然而也最繁琐的一步:数据清理与准备。
###取部分变量###
首先,我们从所有CGSS2015的数据变量中选出之后我们要关注的变量,这有助于提高我们处理的效率。
library("dplyr")
cgss<-select(CGSS,a2,a301,a4,a7a,a18,a10,a8a,a36,a49,a50,a51,a52,a7b,a431)
#从数据库CGSS中按照变量名称选择a2,a301等等变量,并将他们组成另一个数据库,将其保存在了名为cgss的对象中。(R语言是区分大小写的。)
这里有一个特殊的问题。使用haven包载入dta数据(stata对应的数据格式)之后,数据库中的很多变量会设定为haven_labelled,不能随意进行重编码等操作。
library("haven")
cgss<-zap_label(cgss)#将数据库“正常化”。
#####基本人口变量处理#####
社会科学的研究中基本人口学变量是必不可少的。
###生成新变量###
##年龄
分析时,我们常常要根据自己的需要用已有的数据生成自己需要的新信息。比如我们现在就需要知道“年龄”这一信息。
cgss$age<-2015-cgss$a301#在cgss数据库中增加一个名字叫age的变量,它的值是2015-a301
###按条件筛选###
有时候,我们关注的问题要求我们按照条件选出一部分样本作为研究对象。假设我们只想保留18岁以上的样本,将不符合条件的样本删除。
cgss<-filter(cgss,cgss$age>18)#筛选年龄大于18岁的样本
###变量重编码###
我们经常需要将原有的数据重新编码为分类数据,在R中有一种特殊的数据格式factor(因子)可以完成这一任务。使用的命令也很直观
##性别
library("car")
cgss$gender <-cgss$a2#创建gender变量,值与原先的a2变量相同
cgss$gender<-recode(cgss$gender,"2='0';else='1'",as.numeric=T)#重编码为男=1,女=0
cgss$gender<-factor(cgss$gender, levels=c(1,0), labels=c("male","female"))
#将gender设定为类别变量,值为0与1,分别代表女性与男性
###处理缺省值###
一定要确保所有的缺失数据已在分析之前被妥善地编码为缺失值,否则分析结果将失去意义。尤其是CGSS中的一些缺省值没有被标注为NA,而是-8或-3等值。
##民族
cgss$nation<-cgss$a4
#创建nation变量,值与原先a4相同
cgss$nation<-recode(cgss$nation,"-8='-1';2:8='0';else='1'",as.numeric=T)
cgss$nation[cgss$nation ==-1] <- NA
#-8数值代表了缺失值,这里可以特别地将原先nation值为-8的标注为NA
cgss$nation<-factor(cgss$nation, levels=c(1,0), labels=c("hanzu","shaoshu"))
#将nation设定为类别变量,值为0与1,分别代表少数民族与汉族
##教育程度
cgss$edu<-cgss$a7a
cgss$edu<-recode(cgss$edu,"-8='-1';9:14='4';5:8='3';4='2';else='1'",as.numeric=T)
cgss$edu[cgss$edu == -1]<- NA
cgss$edu<-factor(cgss$edu,levels=c(1,2,3,4),labels=c("xiaoxuejiyixia","chuzhong","gaozhongjijixiao","dazhuanjiyishang"))
#这里将教育程度分为"小学及以下";"初中";"高中(专)"和"大专及以上"
##政治面貌
cgss$party<-cgss$a10
cgss$party<-recode(cgss$party,"-8='-1';4='1';else='0'",as.numeric=T)
cgss$party[cgss$party ==-1] <- NA
cgss$party<-factor(cgss$party, levels=c(1,0), labels=c("dangyuan","feidangyuan"))
#这里将政治面貌分为"党员"和"非党员"
##户口
cgss$hukou<-cgss$a18
cgss$hukou<-recode(cgss$hukou,"1='0';else='1'",as.numeric=T)
cgss$hukou<-factor(cgss$hukou, levels=c(1,0), labels=c("nongyehukou","feinonghukou"))
#####自变量处理#####
*PART TWO自变量处理*我们的研究问题是:钱能不能买来快乐?我们用个人全年总收入测量“钱”,相关处理如下:
cgss$income<-cgss$a8a
cgss$income[cgss$income<0] <- NA
#处理缺省值
###变量取对数###
在这里,我们遇到了一个问题。通常来讲,我们假定变量是服从正态分布的。但是我们知道收入的分布状况通常不是如此。
我们可以用以下命令来检验分布状况。
shapiro.test(CGSS$a8a[CGSS$id<5000])
#检验是否为正态分布
hist(CGSS$a8a)
#绘制直方图
通过直方图我们发现,收入这个变量呈现明显的左偏的分布态势,根据统计学原理, 针对左偏的变量我们一般采用取对数的形式来纠正,这是一个常用的处理方法,命令如下:
cgss$lnincome<-log(cgss$income+1)
#对数运算的数学原理中不允许出现0,我们将所有人收入全部+1,可以纳入为0的样本。
调整之后的lnincome变量是大致符合正态分布的
#####因变量处理#####
*PARTTHREE 因变量处理*我们的研究问题是:钱能不能买来快乐?我们用主观幸福感测量“快乐”,相关处理如下:
cgss$happy<-cgss$a36
cgss$happy[cgss$happy<0] <- NA
这里,我们可以以它为基础额外生成一个(0,1)变量,为之后的logistic回归做准备。
cgss$ishappy<-cgss$a36
cgss$ishappy<-recode(cgss$ishappy,"-8='-1';5='1';else='0'",as.numeric=T)
#编码为(0,1)变量,仅将原先自评为十分幸福的样本编码为1
#####控制变量处理#####
*PARTFOUR 控制变量在研究中除了要控制基本的人口学变量之外,还要控制一些混杂因素,正常情况下,控制变量的选择要依照理论,这里仅为了方法上的展示,我们拟控制如下变量:个人能力和社会阶层
##社会阶层
cgss$class<-cgss$a431
cgss$class<-factor(cgss$class, levels=c(1:10))
##个人能力
我们拟采用CGSS问卷中的:“您觉得自己的以下能力是什么水平?”中包括的四个方面:听普通话、说普通话、听英语、说英语等能力作为度量个人能力的指标。
###提取主成分###
我们希望能将上述的几个变量综合考虑,生成一个指标来涵盖或者说是取代数量过多的变量。对于这四个题目我们可以用主成分分析的方法生成一个综合的指标,具体如下:
library("psych")
pc<-principal(cgss[cgss$a49:cgss$a52],,nfactors=1,rotate='varimax',scores=T)
#对cgss中从a49至a52的四个变量进行主成分分析,仅保留一个主成分,并生成一个指标。将该次分析的结果保留在名为pc的对象中
cgss$ability<-pc$scores
#在cgss中生成代表个人能力的新变量,值为pc中scores变量的数值
###删除缺省值###
cgss<-na.omit(cgss)
#将缺省值找到并妥善地标注好了之后,我们可以用这个命令来将所有带有缺省值的样本删除。
###标准化系数###
#cgss.scale<-scale(cgss)
有时候,我们需要将数据标准化。标准化之后的分析在结果上有一些很方便的特性。我们可以用这条命令完成这一过程。在此次分析中,我们暂时用不到它。
经过前面对数据的仔细清理和变量的准备,我们可以很简单地使用R进行线性回归分析以及logistic回归。
m1<-lm(happy~gender+age+nation+hukou+edu+party,data=cgss)
#仅仅使用人口变量进行回归分析
m2<-lm(happy~gender+age+nation+hukou+edu+party+class+ability,data=cgss)
#涵盖了人口变量以及控制变量的模型
m3<-lm(happy~gender+age+nation+hukou+edu+party+class+ability+lnincome,data=cgss)
#将所有相关的变量全部纳入分析模型,通过对比来考察自变量对因变量的影响
logm1<-glm(ishappy~gender+age+nation+hukou+edu+party,family= binomial(link="logit"),data=cgss)
logm2<-glm(ishappy~gender+age+nation+hukou+edu+party+class+ability,family= binomial(link="logit"),data=cgss)
logm3<-glm(ishappy~gender+age+nation+hukou+edu+party+class+ability+lnincome,family= binomial(link="logit"),data=cgss)
#因变量为二分类变量时采用的logistic回归模型,同样可以分为三步进行
(需要安装“stargazer”包。使用命令:install.packages("stargazer"))
经过一些列的数据分析后,到底如何将结果变成可以直接贴在论文的图表呢?在这里介绍几个命令,可以生成描述性统计以及回归分析的表格。
library("stargazer")
cgss<-as.data.frame(cgss)
#将cgss从“tbl_df”类的对象更改为普通的dataframe对象,以顺利地使用函数
###描述表格输出###
look<-select(cgss,ishappy,gender,age,nation,hukou,edu,party,class,ability,lnincome)
#选出我们希望报告的变量
look<-as.data.frame(lapply(look,as.numeric))
#将look数据库中的factor类变量全部变为数值型变量,否则它们在报告中不会出现
stargazer(look,type="text",out ="sum.txt")
#用stargazer命令进行报告
###回归表格输出###
stargazer(m1, m2, m3, type="text", out="lms.txt")
stargazer(logm1, logm2, logm3, type="text", out="glms.txt")
#并排输出在报告中使用的回归表格,通过模型的比较以说明自变量和因变量之间的关系。
R语言推荐课程:
精彩回顾:
·END·
基础·前沿·实用
以上是关于基础方法 | 用R语言完成量化论文全流程示例!附超详细R脚本的主要内容,如果未能解决你的问题,请参考以下文章