在另一个函数中创建R测量设计对象

时间:2018-11-20 03:24:54

标签: r function survey

我尝试使用在我正在创建的新函数中提供的参数来创建R测量设计对象(从R survey包),但未成功。此新功能旨在在计算作为该功能一部分而得出的患病率估算时考虑到复杂的调查设计。如果将调查设计对象作为参数提供给函数,则可以成功使新函数正常工作;但是,我不希望这样做,因为这会使事情变得复杂。以下是示例数据,我要创建的函数以及在新函数中创建调查设计对象的尝试失败。对于以下示例,数据帧为n,我希望在新函数中创建的调查设计对象为svyob,权重变量为wt,id变量为{{1 }},并且阶层变量为psu。我的新函数的期望结构以及默认值如下(请注意,我的结果将在函数中导出。但是出于说明目的,假设它是性别的分布):

stratum

数据:

    prev = function(data, wt, psu = 1, stratum = NULL) {
    #Step1: Derive outcome of interest from dataframe (not shown)
    #Step2: Create survey design object  
    svyobj = survey::svydesign(data = n, weights =~ wt[1], id =~ psu[1], strata =~ stratum[1], nest = T)
   #Step 3: Generate summary estimates
    svymean(~outcome, svyobj, svyobj, na.rm = T) 
    }

*到目前为止,我在上述步骤2中提供权重变量一直不成功。我尝试将权重变量指定为weights =“ wt”,weights = eval(parse(text =“ wt”)),weights = eval(quote(wt)),weights = wt [1]等。全部为无有用。一些错误声明如下:

  •   

    weights = as.formula(paste0(“〜”,eval(parse(text =“ wt”)))))#错误{:任务1失败-“(下标)逻辑下标太长”

         

    weights = as.formula(paste0(“〜”,eval(get(wt))))#get(wt)错误:找不到对象'wt'

我将不胜感激。

1 个答案:

答案 0 :(得分:0)

我终于使我的代码同时适用于以下两个方面(适用于#2):

 #Using (eval(parse())   
     svyobject = svydesign(data=n, id= as.formula(paste0("~", eval(parse(text = "psu")))) , strata=as.formula(paste0("~", eval(parse(text = "stratum")))), weights= as.formula(paste0("~", eval(parse(text = "wt")))), nest=TRUE) 

 #Using (eval(get())   
    svyobject = svydesign(data=n, id= as.formula(paste0("~", eval(get("psu")))) , strata=as.formula(paste0("~", eval(get("stratum")))), weights= as.formula(paste0("~", eval(get("wt")))), nest=TRUE)