【问题标题】:creating an R survey design object within another function在另一个函数中创建 R 调查设计对象
【发布时间】:2023-04-06 17:00:03
【问题描述】:

我尝试使用我正在创建的新函数中提供的参数创建一个 R 调查设计对象(来自 R survey 包),但未成功。这一新功能旨在说明计算作为该功能一部分得出的流行率估计的复杂调查设计。如果我在函数中提供调查设计对象作为参数,我可以成功地使新函数工作;但是,我不想这样做,因为它会使事情复杂化。下面是示例数据、我尝试创建的函数以及我在新函数中创建调查设计对象的失败尝试。对于以下示例,数据框为n,我希望在新函数中创建的调查设计对象为svyob,权重变量为wt,id 变量为psu,strata 变量为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) 
    }

数据:

structure(list(wt = 1365.61822580832, psu = 600815, strata = structure(9L, .Label = c("101", 
"102", "103", "104", "111", "112", "113", "114", "201", "203", 
"204", "211", "212", "213", "214"), class = "factor"), age = 1, 
    sex = 1, school = 1), row.names = 50L, class = "data.frame")

*到目前为止,我在上面的步骤 2 中提供权重变量是不成功的。我尝试将权重变量指定为 weights = "wt"、weights = eval(parse(text = "wt"))、weights = eval(quote(wt))、weights = wt[1] 等。利用。一些错误陈述如下:

  • weights= as.formula(paste0("~", eval(parse(text = "wt")))) # Error in { : task 1 failed - "(subscript) logical subscript too long"

    weights= as.formula(paste0("~", eval(get(wt)))) #Error in get(wt) : object 'wt' not found

我将非常感谢任何帮助。

【问题讨论】:

  • 我认为你不需要eval(get( ..也许可以将权重作为字符向量wtvar 传递,然后在svydesign() 调用中使用weights = as.formula( paste( "~" , wtvar ) )
  • 谢谢!它按照你的建议工作。非常感谢。

标签: r function survey


【解决方案1】:

我终于让我的代码与以下两个一起工作(去了#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) 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-07
    • 1970-01-01
    • 1970-01-01
    • 2021-02-26
    • 2018-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多