stelladi

R语言学习笔记2(学习林月老师R课程)

一、R下载及推荐学习书目

推荐学习书目:至少需要学习5本R语言有关的书才能说你掌握了R

R语言之书编程与统计,Tilman M.Davis著作,李毅译.2019

R markdown:The Definitive Guide,https://bookdown.org/yihui/rmarkdown/

    • R下载:The Comprehensive R Archive Network (ustc.edu.cn)首次下载直接点击base包
    • R studio下载:R studio是IDE集成开发环境,结合了R和R markdown。R已经有完整可用的功能套件,但是对初学者来说比较难用,因此需要安装整合数据分析(R)和论文写作的集成开发环境(R studio)Download the RStudio IDE - RStudio
    • 论文写作的英文环境搭建:打开R studio-file-new file-R markdown,首次打开的时候会弹出对话框,直接yes就会自动下载需要的包。使得我们可以新建输出格式为pdf的.rmd文档,之后输出PDF会报错“pdflatex not found”因为没有安装LaTaX环境。
      • 安装LaTaX环境方案一:只是写课堂作业研究报告,对学术要求不高。但要求之前安装过LaTeX的需要卸载已经安装好的,避免两个LaTeX起冲突。
        #直接在console控制台输入
        install.packages('tinytex')
        tinytex::install_tinytex()
      • 安装LaTaX环境方案二:经常需要写学术论文
        #从TeX Live、MiKTex、MacTex中选一个百度搜索安装,会经历漫长的下载和安装过程
        #安装之后重启R studio就可以正常从R studio中导出PDF了
    •  论文写作的中文环境搭建
      #在控制台安装模板包rticles
      install.packges("rticles")
      #点击菜单栏file-new file-R markdown-form a template-CTex
      #还有很多适用于不同期刊的R markdown模板,其中只有CTex是支持中文显示的模板,唯一缺点是页边距大,调整页边距,在documentclass下一排输入(下列实例是比较常见的页边距情况)
      geometry:"left=2.5cm,right=2cm,top=3cm,bottom=2.5cm"

二、R语言数据类型和变量调用

1. R中的数据类型

 

 2. R中的数据结构

向量vector、矩阵matrix、数据框dataframe(跟matrix相似但不要求数据类型一致,只要求向量长度相等)、数组Array(matrx在多维上的扩展)、列表list(什么都可以往里放,组成部分是元素,列表中甚至可以包括列表)

 

3.变量调用:子集运算符(subsetting operators)[ ]、[[ ]]、$

  • 基于位置索引或者逻辑索引提取
    #1.创建向量
    color <- c("red",”yellow“)
    color
    #输出的结果:[1]"red" ”yellow“
    
    #2.创建矩阵
    c(1:24)
    #输出的结果:
    #[1]1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
    #[19]19 20 21 22 23 24
    
    #这里的[1]和[19]是紧贴着方括号的元素的位置,因此位置编号的方式是从左到右依次编号
    
    #3.创建矩阵
    num <- matrix(c(1:4),2,2)
    num
    #输出结果是(行,列)
    #     [,1][,2]
    #[1,]  1   3
    #[2,]  2   4
    
    #4.创建数据框:因为数据框只要求长度一致,不要求数据类型一致,因此可以将上述的向量和矩阵组成数据框
    df <- data.frame(color, num)
    df
    #输出结果为,因为num没有特定的名字所以默认为x1,x2
    #color x1 x2
    #red    1   3
    #yellow2   4
    #想要在表格中查看上述,用View(df)
    
    #现在要看看如何提取变量
    #(1)df[1]:输出结果直接是第一列
    #color
    #red
    #yellow
    #(2)df[,1]:输出结果是[1] ”red“ "yellow"
    #(3)df[[1]]:输出结果是[1] ”red“ "yellow"
    #(4)df[[,1]]:直接报错
    #(5)用变量名称提取df["color"]结果与(1)一致;df[,"color"]结果与(2)一致;df[["color"]]与(3)一致,区别在于一个是给出了位置,一个是给了一个tag
    #(6)那为了方便,不用每次都输入tag,使用$。在有名称的情况下,$返回的结果与[[]]是等价的:df$color,输出结果是[1] ”red“ "yellow"
    
    #5.创建列表;一共有4个元素,color向量,num矩阵,df数据框,array数组
    l <- list(color=color, num, df=df,a=array(c(1:8),dim=c(2,2,2))
    l
    #输出的结果
    #$color
    #[1]"red" "yellow"
    #
    #[[2]]
    #       [,1] [,2]
    #[1,]    1    3
    #[2,]    2    4
    #
    #$df
    #     color x1 x2
    # 1   red    1   3
    # 2   yellow2   4
    #
    #$a
    #,,1
    # [,1] [,2]
    #[1,] 1 3
    #[2,] 2 4
    #
    #,,2
    # [,1] [,2]
    #[1,] 5 7
    #[2,] 6 8

    #现在调用l中的几种情况
    #(1)l[1]:输出结果:
    $color
    [1]"red" "yellow"
    #(2)l[[1]]=l[["color"]]输出结果:
    [1]"red" "yellow"
    #(3)l$df$x1:输出结果[1] 1 2
    #(4)l[["df"]][[2]]:输出结果[1] 1 2
    #(5)l[3]["x1"]:输出结果:返回的是空
    $<NA>
    NULL
    
    #因此[]截取的是什么,返回的就是什么。因此l[3]["x1"]中提取出来的只有一个列表其中不存在x1的元素
    #[[]]则是提取的元素,提取变量返回的是向量而不是数据框  

4.描述性统计:以某一个研究为例

  •  R markdown的基本构成
    • 最前面的YAML,规定文档的整体排版格式,行间距页边距页眉页脚文献引用格式等等(点击最左边可以收起来):前面有title、author、date……页眉页脚一定需要在里面写,写完就可以点击左侧收起
      title: "Descriptive Statistics"
      author: "Linyue"
      date: '2022-05-29'
      bibliography: "Example.bib"
      csl: "apa_7th.csl"
      #插入的bibliography和csl方便插入文献 output: bookdown::pdf_document2
    • 代码块,根据需要在适当的位置插入代码块进行数据分析,可以根据情况选在输出的文档中保留或者隐藏代码:灰色底色的“、、、“之间的是R的代码,最右边可以运行。点击insert a new code可以添加R、Bash、D3、python、SQL等代码块。

    • 文本内容,用R markdown语言规定文本格式,包括加粗、斜体、标题、字体等:引言introduction,蓝色的部分是格式;玫红色是参考文献

  • 研究问题和数据:
    • 母亲抑郁症对初中学生的认知发展的影响
    • 数据来自美国1988-1999年的early childhood longitudual study,kindergarten class从幼儿园追踪到初中毕业,选取8年级的部分数据,总计4577个样本
  • 用R做描述性统计分析和表格展示:
    • {r, include=FALSE}
      #r, echo=FALSE表示不会输出
      #load data,仅运行一行命令:选中该命令所在行(点击最左边的数字)ctrl+enter
      df <- read.csv(file = "maternaldep.csv", header = TRUE)
      #1.数学分数的平均数“df$mathirt”:df为数据名称;$为调用的符号;mathirt为变量名称
      mean(df$mathirt)
      
      #2.数学分数的标准差standard deviation
      sd(df$mathirt)
      
      #3.数学分数的最小值最大值中位数
      min(df$mathirt)
      max(df$mathirt)
      median(df$mathirt)
      
      #4.数学分数的百分位数percentile:这里的是median所以是0.5,后面要说明是多少百分位数
      quantile(df$mathirt,0.5)
      
      #5.对数据中每个变量求均值colMeans(df)
      # summary statistics for data set
      tab_01 = data.frame(
        Mean  = c(colMeans(df)),
        SD = c(sapply(df, sd)),
        Median = c(sapply(df, median)),
        Min = c(sapply(df, min)),
        Max = c(sapply(df, max))
      )
      #SD = c(sapply(df, sd)),sapply循环函数对数据中的每个变量求标准差;后面的以此类推;后面分别mean,SD看运算结果
      
      #6.制作表格,制表命令Kable
      ```{r tab2}
      ## table for descriptive statistics
      kable(
        tab_01,
        col.names = c("Mean", "SD", "Median", "Minimum", "Maximum"),
        digits = 2,
        caption = "\\label{tab2}Summary Statistics",
        booktabs = T 
      #对格式的规定,一般选Ture,如果表格中有莫名其妙的横线你改成F就行了
      ) 
      ```
       

5.单个分类变量声明、频数比例、饼图柱状图、R markdown交叉引用

  • 分类变量的声明
    ```{r, echo=TRUE, message=FALSE, results='hide'}
    # 以种族ethnicity为例,查看种族的变量类型(分类变量还是连续型变量)
    df$ethnicity
    Count <- table(df$ethnicity)
    Count
    #可以看到ethnicity的取值范围是1~4
    library(expss)
    library(maditr) 
    val_lab(df$ethnicity) = num_lab("
                 1 White Non-hispanic
                 2 Black Non-hispanic    
                 3 Hispanic
                 4 Other
    ")
    #意思是白种拉丁裔是1,黑人拉丁裔为2,拉丁裔3,都不是是4。这里的1234可以是连续的也可以是不具备加减含义的分类变量,因此要查看在R中是否是分类变量is.factor(),如果是F就说明是连续变量
    is.factor(df$ethnicity)  # False, not a factor variable
    #连续变量做线性回归,数学成绩和种族coefficients只有一个值,说明确实是当成了连续变量 linear regression when ethnicity is treated as continuous variable
    lm(mathirt~ethnicity, data=df)
    
    # 因此需要把连续变量声明成分类变量define factor variable. ***!!!!Important!!!!!***
    df$ethnicity<- factor(df$ethnicity)
    is.factor(df$ethnicity) # True
    
    #现在看声明的分类变量分成几类,会显示1234中的内容
    levels(df$ethnicity)
    
    #再对数学成绩做线性回归就有4个值了linear regression when ethnicity is treated as factor variable
    lm(mathirt~ethnicity, data=df)
    ```
  • 频数比例
    ```{r, include=FALSE}
    # occurrences
    # 用table()求分类变量各类的频数
    Counts <- table(df$ethnicity)
    Counts
    # proportion
    #直接计算 Calculate proportions for each manually
    Counts / sum( Counts )
    # 用 prop.table()计算各类在总体中的占比
    prop.Counts <- prop.table(Counts)
    prop.Counts
    ```
    Table \@ref(tab:tab3) shows the frequencies and proportions.
    #这里是交叉引用的内容
    ```{r tab3}
    # Use kable to make a frequency table
    tab_02 <- data.frame(Counts, prop.Counts)
    tab_02 <- tab_02[-3]
    #这里是因为第三列是不想要的所以去除掉了,下面是用kable制表
    #注意数据处理和结果作图的代码分开成两个代码块,方便后面形成PDF的时候交叉引用
    
    kable(
      tab_02,
      col.names = c("Class","Frequency",  "Proportion"),
      digits = 2,
      caption = "\\label{3}Frequency table",
      booktabs = T 
    ) %>%
      kable_styling(latex_options =  "hold_position")
    ```
  • 饼状图柱状图
    ```{r fig1, fig.cap="The pie chart"}
    # Make a pie chart
    pie(Counts)
    ```
    
    Figure \@ref(fig:fig2) presents the bar chart.
    ```{r,include=FALSE}
    # Make a bar chart
    barplot(Counts)
    ```
    ```{r fig2,fig.height=3.5, fig.cap="Distribution of ethnicity"}
    #beautify bar chart
    library(RColorBrewer)
    #自动配色的包
    coul <- brewer.pal(4, "Set2") 
    b<- barplot(Counts,
            xlab = "Ethnicity",#x轴标签
            ylab = "Frequency",
            main = "Distribution of ethnicity",
            ylim=c(0,3600),#调整Y轴上限
            col=coul,
            cex.names=0.75,
            space=0.8#柱子之间的间隔
            )
    text(x=b, y= Counts+150, labels=as.character(Counts))#每个柱子上边加上数值,间隔150个单位
    ```
  • 直方图、密度曲线(density curve)和箱线图boxplot
    #集中趋势查(均值和中位数);离散趋势(最小值,最大值,四分位数,方差和标准差)
    ```{r, include=FALSE}
    #1.检查变量是否是数值型的numeric
    is.numeric(df$bweight)
    ```
    #2.评估Evaluating a quantitative variable
    #R自带一个summary()计算最大最小值,四分位数(1、3四分位)和平均值
    #var()计算方差;sd()计算标准差
    #cbind()添加列
    Table \@ref(tab:tab4) shows the center and spread of a variable.
    ```{r, include=FALSE}
    # five number summary
    su <-summary(df$bweight)
    su <- t(as.matrix(unlist(su)))
    # variance and standard deviation 
    var <- data.frame(var(df$bweight))
    sd <- sd(df$bweight)
    tab_03 <- cbind(su, var, sd)
    ```
    ```{r tab4}
    ## table for center and spread
    kable(
      tab_03,
      col.names = c("Minimum", "Q1", "Median", "Mean", "Q3", "Maximum","Variance", "Std. Dev."),
      digits = 2,
      caption = "\\label{tab3}Center and spread",
      align = "c",#c表示居中排列,lr分别表示左右对齐
      booktabs = T 
    ) %>% kable_styling(latex_options = c("hold_position"))
    ```
    
    #3.绘制直方图Histogram graph
    ```{r, include=FALSE}
    hist(df$bweight)
    ```
    #绘制出来的还比较钟型,bell-shaped,  uni-modal and symmetrical. 
    ```{r fig3,fig.height=3.5, fig.cap="Histogram graph"}
     hist(df$bweight,
         main = "Histogram graph of birth weight",
         xlab = "Birth weight (lbs)",
         breaks = 20)
    ```
    
    #4.给直方图绘制密度曲线
    ```{r fig4, fig.height=3.5, fig.cap="Histogram and density graph of birth weight"}
    par(mfrow=c(1,2))
    # Adding density curve 
    hist(df$bweight,
         main = "Adding density curve",
         xlab = "Birth weight (lbs)",
         prob = TRUE,
         ylim=c(0, .4),#定义Y轴最大值
         cex.main=0.9,#调整字体大小
         col = "peachpuff",#定义画图主体颜色
         breaks = 20)
    lines(density(df$bweight), #增加密度曲线
          lwd = 2, #thickness of line线的粗细
          col = "chocolate3")
    #5.加上密度曲线和正态分布曲线 normal distribution curve 
    hist(df$bweight,
         main = "Adding normal distribution curve",
         xlab = "Birth weight (lbs)",
         ylab = "",
         prob = TRUE,
         ylim=c(0, .4),
         cex.main=0.9,
         breaks = 20,
         col = "peachpuff")
    lines(density(df$bweight), #density plot
          lwd = 2, #thickness of line
          col = "chocolate3")
    curve(dnorm(x,mean=mean(df$bweight), 
                 sd=sd(df$bweight,na.rm=T)), add=T, col='blue')
    ```
    
    #6.Boxplot
    #离群值outliers:Q1-1.5IQR跟最小值比较,如果比最小值大,这条线就是Q1-1.5IQR;如果比最小值小,那么最小值是这条线(Q1为第一四分位数);中间的黑色线是中位数;上面的线是第三四分位数(判断是通过Q3+1.5IQR跟最大值用最大的当上面的线),最上面和最下面的线叫whisker,whisker外面的点就是离群值
    ```{r, include=FALSE}
    boxplot(df$bweight)
    #也可以去掉离群值再画一次
    boxplot(df$bweight, outline = FALSE)
    ```
    #对去掉离群值的箱线图进行标注
    ```{r fig5,fig.height=3.5, fig.cap="Boxplot of birth weight"}
    #因为summrize是第一行第一列,因此取数据框中的第一行第一列su[,1];su[,2]-1.5*IQR(df$bweight)第一四分位数家-1。5IQR;su[,2:3]第四百分位数和中位数在2,3列; su[,5]+1.5*IQR(df$bweight)在第五列的第三四分位数+1.5IQR;su[,6]最大值在第六列
    x.value <- c(su[,1],su[,2]-1.5*IQR(df$bweight),su[,2:3],
               su[,5]+1.5*IQR(df$bweight),su[,6])
    #保留小数点两位数,有几位round到几位
    x.value <- round(x.value,digits = 2)
    fig <- boxplot.default(df$bweight, horizontal = TRUE, #变成横着的
                    boxwex=.8,#箱体的宽度是之前的0.8倍
                    col = "light grey",
                    xlab = "Birth weight (lbs)",
                    pch = 20,#规定离群值用实心点,防都在一起看不清楚。用第20种即实心点
                    cex = 0.3,#实心圆点大小0.3
                    outcol="red",#离群值的颜色
                    staplewex = 0.5)#分割线的宽度=1是正常的,0.5缩短
    text(x=x.value, labels =x.value, y=1.3, cex=0.8)#标注添加文字:在X轴的位置增加X值,y轴的位置是1.3,文字大小为0.8
  • ≥2个分类变量的描述性分析和作图(列联表、卡方独立性检验、Fisher精确检验、Cramer's V系数、lambda系数、柱状堆积图、并列柱状图)
    • 二维列联表分析:通常会将因变量Y按行分类,自变量按列分类。(1)按照列计算Y的频数分布(2)按行比较是否有比例变化。如果比例变化则说明有相关性
      • 如果母亲抑郁程度不会随着性别的变化发生变化,则说明母亲抑郁与孩子性别没有相关性。
    • Pearson卡方独立检验:如果Y和X相关,那么Y的条件概率分布随着X的取值不同而变化。做推断
    • Fisher精确检验:比P值还要大,则说是极端值。说是精确,而大家都用卡方的原因是如果没有计算机是没法算fisher的
    • Cramer's V系数、lambda系数:现在看两者之间的强弱关系如何
      • Cramer's V系数:适用于名义变量或者有序变量,每个变量至少有两个分类(0~0.1弱相关;0.11~0.3一般相关;>0.3强相关) 
      • lambda系数:
    • 柱状堆积图、并列柱状图

6.单个连续变量作图及分析

posted on 2022-09-05 21:33  Stellaself  阅读(434)  评论(1)    收藏  举报

导航