添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
  • 52.2.1 evalCpp() 转换单一计算表达式
  • 52.2.2 cppFunction() 转换简单的C++函数—Fibnacci例子
  • 52.2.3 sourceCpp() 转换C++程序—正负交替迭代例子
  • 52.2.4 sourceCpp() 转换C++源文件中的程序—正负交替迭代例子
  • 52.2.5 sourceCpp() 转换C++源程序文件—卷积例子
  • 52.2.6 随机数例子
  • 52.2.7 bootstrap例子
  • 52.2.8 在Rmd文件中使用C++源程序文件
  • 53 R与C++的类型转换
  • 53.1 wrap() 把C++变量返回到R中
  • 53.2 as() 函数把R变量转换为C++类型
  • 53.3 as() wrap() 的隐含调用
  • 54 Rcpp 属性
  • 54.1 Rcpp属性介绍
  • 54.2 在C++源程序中指定要导出的C++函数
  • 54.2.1 特殊注释 //[[Rcpp::export]]
  • 54.2.2 修改导出的函数名
  • 54.2.3 可导出的函数
  • 54.3 在R中编译链接C++代码
  • 54.3.1 sourceCpp() 函数中直接包含C++源程序字符串
  • 54.3.2 cppFunction() 函数中直接包含C++函数源程序字符串
  • 54.3.3 evalCpp() 函数中直接包含C++源程序表达式字符串
  • 54.3.4 depends 指定要链接的库
  • 54.4 Rcpp属性的其它功能
  • 54.4.1 自变量有缺省值的函数
  • 54.4.2 异常传递
  • 54.4.3 允许用户中断
  • 54.4.4 把R代码写在C++源文件中
  • 54.4.5 invisible 要求函数结果不自动显示
  • 54.4.6 在C++中调用R的随机数发生器
  • 55 Rcpp提供的C++数据类型
  • 55.1 RObject类
  • 55.2 IntegerVector类
  • 55.2.1 IntegerVector示例1:返回完全数
  • 55.2.2 IntegerVector示例2:输入整数向量
  • 55.3 NumericVector类
  • 55.3.1 示例1:计算元素 \(p\) 次方的和
  • 55.3.2 示例2: clone 函数
  • 55.3.3 示例3:向量子集
  • 55.4 NumericMatrix类
  • 55.4.1 示例1:计算矩阵各列模的最大值
  • 55.4.2 示例2:把输入矩阵制作副本计算元素平方根
  • 55.4.3 示例3:访问列子集
  • 55.5 Rcpp的其它向量类
  • 55.5.1 Rcpp的LogicalVector类
  • 55.5.2 Rcpp的CharacterVector类型
  • 55.6 Rcpp提供的其它数据类型
  • 55.6.1 Named类型
  • 55.6.2 List类型
  • 55.6.3 Rcpp的DataFrame类
  • 55.6.4 Rcpp的Function类
  • 55.6.5 Rcpp的Environment类
  • 56 Rcpp糖
  • 56.1 简单示例
  • 56.2 向量化的运算符
  • 56.2.1 向量化的四则运算
  • 56.2.2 向量化的赋值运算
  • 56.2.3 向量化的二元逻辑运算
  • 56.2.4 向量化的一元运算符
  • 56.3 用Rcpp访问数学函数
  • 56.4 用Rcpp访问统计分布类函数
  • 56.5 在Rcpp中产生随机数
  • 56.6 返回单一逻辑值的函数
  • 56.7 返回糖表达式的函数
  • 56.7.1 is_na
  • 56.7.2 seq_along
  • 56.7.3 seq_len
  • 56.7.4 pmin pmax
  • 56.7.5 ifelse
  • 56.7.6 sapply lapply
  • 56.7.7 sign
  • 56.7.8 diff
  • 56.8 R与Rcpp不同语法示例
  • 56.9 用RcppArmadillo执行矩阵运算
  • 56.9.1 生成多元正态分布随机数
  • 56.9.2 快速计算线性回归
  • 57 用Rcpp帮助制作R扩展包
  • 57.1 不用扩展包共享C++代码的方法
  • 57.2 生成扩展包
  • 57.2.1 利用已有基于Rcpp属性的源程序制作扩展包
  • 57.2.2 DESCRIPTION文件
  • 57.2.3 NAMESPACE文件
  • 57.3 重新编译
  • 57.4 建立C++用的接口界面
  • XI 其它
  • 58 R编程例子
  • 58.1 R语言
  • 58.1.1 用向量作逆变换
  • 58.1.2 斐波那契数列计算
  • 58.1.3 穷举所有排列
  • 58.1.4 可重复分组方式穷举
  • 58.1.5 升降连计数
  • 58.1.6 高斯八皇后问题
  • 58.1.7 最小能量路径
  • 58.2 概率
  • 58.2.1 智者千虑必有一失
  • 58.2.2 圆桌夫妇座位问题
  • 58.3 科学计算
  • 58.3.1 城市间最短路径
  • 58.3.2 Daubechies小波函数计算
  • 58.3.3 房间加热温度变化
  • 58.4 统计计算
  • 58.4.1 线性回归实例
  • 58.4.2 核回归与核密度估计
  • 58.4.3 二维随机模拟积分
  • 58.4.4 潜周期估计
  • 58.4.5 ARMA(1,1)模型估计
  • 58.4.6 VAR模型平稳性
  • 58.4.7 贮存可靠性评估
  • 58.5 数据处理
  • 58.5.1 小题分题型分数汇总
  • 58.5.2 类别编号重排
  • 58.6 文本处理
  • 58.6.1 用R语言下载处理《红楼梦》htm文件
  • 59 使用经验
  • 59.1 文件管理
  • 59.1.1 工作空间
  • 59.2 程序格式
  • A R Markdown文件格式
  • A.1 R Markdown文件
  • A.2 R Markdown文件的编译
  • A.2.1 编译的实际过程
  • A.3 在R Markdown文件中插入R代码
  • A.4 输出表格
  • A.5 利用R程序插图
  • A.6 冗余输出控制
  • A.7 代码段选项
  • A.7.1 代码和文本输出结果格式
  • A.7.2 图形选项
  • A.7.3 缓存(cache)选项
  • A.8 章节目录链接问题
  • A.9 其它编程语言引擎
  • A.10 交互内容
  • A.11 属性设置
  • A.11.1 YAML元数据
  • A.11.2 输出格式
  • A.11.3 输出格式设置
  • A.11.4 目录设置
  • A.11.5 章节自动编号
  • A.11.6 Word输出章节自动编号及模板功能
  • A.11.7 HTML特有输出格式设置
  • A.11.8 关于数学公式支持的设置
  • A.11.9 输出设置文件
  • A.12 LaTeX和PDF输出
  • A.12.1 TinyTex的安装使用
  • A.12.2 Rmd中Latex设置
  • A.13 生成期刊文章
  • A.14 附录:经验与问题
  • A.14.1 Word模板制作
  • A.14.2 数学公式设置补充
  • B 用bookdown制作图书
  • B.1 介绍
  • B.2 一本书的设置
  • B.3 章节结构
  • B.4 书的编译
  • B.5 交叉引用
  • B.6 数学公式和公式编号
  • B.7 定理类编号
  • B.8 文献引用
  • B.9 插图
  • B.10 表格
  • B.10.1 Markdown表格
  • B.10.2 kable() 函数制作表格
  • B.10.3 R中其它制作表格的包
  • B.11 数学公式的设置
  • B.12 使用经验
  • B.12.1 学位论文
  • B.12.2 LaTeX
  • B.12.3 算法
  • B.12.4 中文乱码
  • B.12.5 图片格式
  • B.12.6 其它经验
  • B.13 bookdown的一些使用问题
  • C 用R Markdown制作简易网站
  • C.1 介绍
  • C.2 简易网站制作
  • C.2.1 网站结构
  • C.2.2 编译
  • C.2.3 内容文件
  • C.2.4 网站设置
  • C.3 用blogdown制作网站
  • C.3.1 生成新网站的框架
  • C.3.2 网页内容文件及其设置
  • C.3.3 初学者的工作流程
  • C.3.4 网站设置文件
  • C.3.5 静态文件
  • D 制作幻灯片
  • D.1 介绍
  • D.2 Slidy幻灯片
  • D.2.1 文件格式
  • D.2.2 幻灯片编译
  • D.2.3 播放控制
  • D.2.4 生成单页HTML
  • D.2.5 数学公式处理与输出设置文件
  • D.2.6 其它选项
  • D.2.7 slidy幻灯片激光笔失效问题的修改
  • D.3 MS PowerPoint幻灯片
  • D.4 Bearmer幻灯片格式
  • D.5 R Presentation格式
  • References
  • 编著:李东风
  • names_to = "grp" , values_to = "y" ) |> mutate ( grp = factor (grp, levels= c ( "A" , "B" , "C" ))) |> arrange (grp) knitr :: kable (d.manu)
    ##             Df Sum Sq Mean Sq F value  Pr(>F)   
    ## grp          2    520  260.00   9.176 0.00382 **
    ## Residuals   12    340   28.33                   
    ## ---
    ## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

    主效应 grp (分组)的F检验的p值为0.004, 若检验水平为0.05则分组效应显著, 各组之间有显著差异。

    可以用并列盒形图比较各组的取值, 并检查分布对称性和方差齐性:

    从图形看,C组的工作效率显著低于A组和B组, A、B两组之间差异不明显。

    为了检查各组方差是否相等,可以进行Bartlett检验:

    ## Bartlett test of homogeneity of variances ## data: y by grp ## Bartlett's K-squared = 0.024476, df = 2, p-value = 0.9878

    结果表明可以认为各组的方差相等。

    除了各组并列盒形图, 也可以做点图并将各组的均值、均值置信区间作图,如:

    可以看出C的误差条(均值置信区间)低于A和B的误差条, 而A和B的误差条有交集。

    36.1.2 功效与样本量计算

    对均衡设计的单因素方差分析, 可以用pwr包的 pwr.anova.test() 函数计算功效和样本量。 设 \(k\) 个组的因变量(指标)值共同的标准差为 \(\sigma_{\text{within}}\) , 而各个组的均值的样本标准差为 \(\sigma_{\text{between}}\) (但是使用 \(k\) 作为分母而不是 \(k-1\) 作为分母), 定义要检验的效应大小为 f = \frac{\sigma_{\text{between}}}{\sigma_{\text{within}}} . 典型的效应大小值为:

  • 小: \(0.1\) ;
  • 中: \(0.25\) ;
  • 大: \(0.4\)
  • 考虑前面比较三种工艺的例子, 取检验水平 \(0.05\) , 每组样本量 \(n = 5\) , 要检验中等的效应大小,

    ## Warning: package 'pwr' was built under R version 4.2.2
    ## Conventional effect size from Cohen (1982) ## test = anov ## size = medium ## effect.size = 0.25 ## Balanced one-way analysis of variance power calculation ## k = 3 ## n = 5 ## f = 0.25 ## sig.level = 0.05 ## power = 0.1095297 ## NOTE: n is number in each group

    功效只有 \(11\%\) 。 计算达到 \(80\%\) 功效所需样本量:

    ## Conventional effect size from Cohen (1982) ## test = anov ## size = medium ## effect.size = 0.25 ## Balanced one-way analysis of variance power calculation ## k = 3 ## n = 52.3966 ## f = 0.25 ## sig.level = 0.05 ## power = 0.8 ## NOTE: n is number in each group

    需要每组 \(53\) 个试验值。

    我们计算一下比较工艺例子中实际数据反映出来的效应大小。

    sigs <- d.manu |>
      group_by(grp) |>
      summarise(
        ng = n(),
        gmean = mean(y),
        gstd = sd(y),
        .groups = "drop") |>
      summarise(
        sig_within = sqrt(sum(gstd^2) / 3),
        sig_between = sd(gmean) * sqrt(2/3)  ) 
    fv <- sigs |>
      mutate(f = sig_between / sig_within) |>
      pull()
    
    ## [1] 1.106133

    按这个效应计算检验的功效:

    ## Balanced one-way analysis of variance power calculation ## k = 3 ## n = 5 ## f = 1.106133 ## sig.level = 0.05 ## power = 0.9292112 ## NOTE: n is number in each group

    功效有 \(93\%\) 。 计算 \(80\%\) 功效需要的样本量:

    ## Balanced one-way analysis of variance power calculation ## k = 3 ## n = 3.82216 ## f = 1.106133 ## sig.level = 0.05 ## power = 0.8 ## NOTE: n is number in each group

    每组4各试验即可。

    基本R的 power.anova.test() 也能计算功效, 需要输入组内方差、组间方差, 而且计算组间方差时用的是各组均值方差使用 \(k-1\) (组数)作为分母的公式。

    ## Balanced one-way analysis of variance power calculation ## groups = 3 ## n = 5 ## between.var = 52 ## within.var = 28.33333 ## sig.level = 0.05 ## power = 0.9292112 ## NOTE: n is number in each group

    pwr.anova.test() 输出的结果相同。

    36.1.3 多重比较

    为了找到各组两两之间是否有显著差异, 可以进行两两的独立两样本t检验, 但这样不能利用共同的模型参数, 进行多次重复检验也会使得总第一类错误概率变得比较高, 发生过度拟合。

    进行多个假设检验(如均值比较)的操作称为“多重比较”(multiple comparison, 或multiple testing), 多次检验会使得总第一类错误概率增大。 以两两比较为例, 当比较次数很多时, 即使所有的组之间都没有真实的差异, 很多个两两比较也会找到差异最大的一对, 使得发现的的显著差异有很大可能性不是真实存在的。

    为此,可以进行一些调整, 使得报告的检验p值能够控制总第一类错误概率。 multcomp包的 glht() 函数可以对方差分析结果进行多重比较并控制总错误率, 一种方法是利用Tukey的HSD(Honest Significant Difference)方法, 程序如下:

    ## Simultaneous Tests for General Linear Hypotheses ## Multiple Comparisons of Means: Tukey Contrasts ## Fit: aov(formula = y ~ grp, data = d.manu) ## Linear Hypotheses: ## Estimate Std. Error t value Pr(>|t|) ## B - A == 0 4.000 3.367 1.188 0.4820 ## C - A == 0 -10.000 3.367 -2.970 0.0292 * ## C - B == 0 -14.000 3.367 -4.159 0.0034 ** ## --- ## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 ## (Adjusted p values reported -- single-step method)

    Tukey HSD检验的结果是, 在0.05水平下, A和B没有显著差异, C与A、B均有显著差异。

    36.1.4 方差不相等情形

    方差分析模型要求误差项独立同正态分布N(0, \(\sigma^2\) ), 这意味着各组的因变量方差相等。 实际中不同组的因变量可能有不同的方差。 R提供了 oneway.test() 函数作为独立两样本t检验的Welch方法的推广, 可以不要求方差相等。

    ## One-way analysis of means (not assuming equal variances) ## data: y and grp ## F = 8.1976, num df = 2.0000, denom df = 7.9914, p-value = 0.01159

    p值为0.011,在0.05水平下显著, 说明三种生产工艺的时间有显著差异。

    为了进行多重比较, 可以进行两两t检验并不使用合并的标准差估计, 使用Holm方法进行p值调整以控制总错误率:

    ## Pairwise comparisons using t tests with non-pooled SD ## data: y and grp ## A B ## B 0.258 - ## C 0.039 0.010 ## P value adjustment method: holm

    在0.05水平下, A和B没有显著差异,C与A和B都有显著差异。

    36.1.5 非参数方差分析

    如果各组的因变量(指标)分布严重偏离正态, 则单因素方差分析所依据的F检验会有很大的误差。 可以使用非参数方法, Kruskal-Wallis检验是独立两样本比较的Wilcoxon秩和检验的推广。

    ## Kruskal-Wallis rank sum test ## data: y by grp ## Kruskal-Wallis chi-squared = 7.7677, df = 2, p-value = 0.02057

    检验p值为0.02,在0.05水平下拒绝零假设, 认为各组之间有显著差异。

    36.2 协方差分析

    在单因素方差分析问题中, 有可能存在一个连续型的解释变量, 对因变量(指标)有影响, 希望在排除此连续型解释变量影响后对各组进行比较。 这相当于如下的模型: \[\begin{aligned} y_{ij} = \mu_i + \beta x_{ij} + e_{ij}, \end{aligned}\] 其中 \(x_{ij}\) 为已知值的解释变量。

    例子 考虑multcomp包的litter数据。 为研究某种药物对出生小数体重的影响, 将若干怀孕小鼠随机分配到4个不同的处理组, 变量 dose 表示这4个组, 其取值是母鼠服药的剂量。 研究的因变量(指标)是母鼠所生产的幼鼠的平均体重(weight), 要排除协变量 gesttime (怀孕时间)的影响。 这个数据的各组试验数不相同,频数统计为:

    summary (aov.lit1)
    ##             Df Sum Sq Mean Sq F value  Pr(>F)   
    ## gesttime     1  134.3  134.30   8.049 0.00597 **
    ## dose         3  137.1   45.71   2.739 0.04988 * 
    ## Residuals   69 1151.3   16.69                   
    ## ---
    ## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

    从结果中 dose 的检验结果看, 排除协变量 gesttime 影响后, 在0.05水平下, 四个处理组之间有显著差异。

    将服药的三个组的均值与不服药(dose=0)的组比较的检验如下:

    ## Simultaneous Tests for General Linear Hypotheses ## Multiple Comparisons of Means: User-defined Contrasts ## Fit: aov(formula = weight ~ gesttime + dose, data = litter) ## Linear Hypotheses: ## Estimate Std. Error t value Pr(>|t|) ## 服药与不服药比较 == 0 8.284 3.209 2.581 0.012 * ## --- ## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 ## (Adjusted p values reported -- single-step method)

    检验的零假设为 \(H_0: \alpha_1 = (\alpha_2 + \alpha_3 + \alpha_4)/3\) , 其中 \(\alpha_j\) 表示第 \(j\) 个组的均值, \(\alpha_1\) 对应于 dose=0 的组, 即不服药的组。 检验结果表明在0.05水平下, 服药的和不服药的指标均值有显著差异。

    36.3 两因素方差分析

    两因素方差分析, 最简单的情形是有两个分组变量(称为因素)A和B, \(A\) \(s\) 个分类, \(B\) \(t\) 个分类, 对 \(A\) \(B\) 的每一种搭配 \((i,j)\) , 重复试验 \(r\) 次得到观测值 \(y_{ijk}\) , 设各次观测值相互独立。 y_{ijk} = \mu_{ij} + e_{ijk}, \ i=1,\dots,s, \ j=1,\dots,t, \ k=1,\dots, r, 误差项 \(e_{ijk}\) 独立同正态分布N(0, \(\sigma^2\) )。

    一般将上述模型用另外的参数表示成: \[\begin{aligned} y_{ijk} =& \mu + \alpha_i + \beta_j + \gamma_{ij} + e_{ijk}, \end{aligned}\] 其中 \(\alpha_i\) 表示因素A的“主效应”, \(\beta_j\) 表示因素 \(B\) 的主效应, \(\gamma_{ij}\) 表示因素A和因素B的交互作用效应。 这样模型中的参数是冗余的, 一般会加限制, 比如设 \(\alpha_1 = 0\) \(\beta_1 = 0\) \(\gamma_{i1} = \gamma_{1j} = 0\)

    二元方差分析的问题是分别检验两个因素的主效应是否显著(不等于零), 交互作用效应是否存在(不等于零)。

    36.3.1 两因素方差分析计算示例

    以R的datasets包的ToothGrowth数据为例。 考虑维生素C对豚鼠的成牙质细胞生长的影响, 因变量(指标) len 是某牙齿长度测量值, 考虑两种不同的维生素C类型(变量 supp ,取值为OJ或VC), 以及三种剂量(变量 dose , 取值为0.5, 1.0, 2.0)。 需要将这两个因素都转换成R的因子:

    ##   supp dose  n
    ## 1   OJ  0.5 10
    ## 2   OJ    1 10
    ## 3   OJ    2 10
    ## 4   VC  0.5 10
    ## 5   VC    1 10
    ## 6   VC    2 10

    可见这个试验是均衡有重复完全试验设计。

    进行二元方差分析:

    ##             Df Sum Sq Mean Sq F value   Pr(>F)    
    ## dose         2 2426.4  1213.2  92.000  < 2e-16 ***
    ## supp         1  205.4   205.4  15.572 0.000231 ***
    ## dose:supp    2  108.3    54.2   4.107 0.021860 *  
    ## Residuals   54  712.1    13.2                     
    ## ---
    ## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

    在0.05水平下, 两个主效应和交互作用效应都显著。

    36.3.2 交互作用图

    R函数 interaction.plot() 可以绘制表示交互作用的图形。 此图形以因变量为y坐标, 以第一个因素的水平为横坐标作折线图, 但根据第二个因素的不同水平分组作图。 如果不同组的折线图基本平行则没有交互作用效应, 否则提示有交互作用效应。

    图形结果提示有交互作用效应。