【问题标题】:User-defined function with lapply function带有 lapply 函数的用户定义函数
【发布时间】:2014-12-19 00:01:37
【问题描述】:

我正在尝试建立一个用户定义的函数,该函数输入来自活动数据帧的预定变量(独立和依赖)。让我们以下面的示例数据框df 为例,看看其他记录变量导致的抛硬币结果:

> df
  outcome toss    person  hand age
1       H    1      Mary  Left  18
2       T    2     Allen  Left  12
3       T    3       Dom  Left  25
4       T    4 Francesca  Left  42
5       H    5      Mary Right  18
6       H    6     Allen Right  12
7       H    7       Dom Right  25
8       T    8 Francesca Right  42

dfdata 框架有一个二项式响应 outcome 是正面或反面,我将看看 personhandage 可能如何影响这个分类结果。我计划使用一种前向选择方法,该方法将针对toss 测试一个变量,然后继续添加更多变量。

为了简单起见,我希望能够在我的用户定义函数之前识别响应/依赖(例如,outcome)和预测/独立(例如,person,hand)变量比如:

> independent<-c('person','hand','age')
> dependent<-'outcome'

然后使用lapplyglm 函数创建我的函数:

> test.func<-function(some_data,the_response,the_predictors)
+ {
+     lapply(the_predictors,function(a)
+         {
+         glm(substitute(as.name(the_response)~i,list(i=as.name(a))),data=some_data,family=binomial)
+     })
+ }

然而,当我尝试使用预定向量运行函数时,会发生这种情况:

> test.func(df,dependent,independent)
Error in as.name(the_response) : object 'the_response' not found

我的预期反应如下:

models<-lapply(independent,function(x)
+ {
+     glm(substitute(outcome~i,list(i=as.name(x))),data=df,family=binomial)
+ })
> models
[[1]]

Call:  glm(formula = substitute(outcome ~ i, list(i = as.name(x))), 
    family = binomial, data = df)

Coefficients:
    (Intercept)        personDom  personFrancesca       personMary  
      1.489e-16       -1.799e-16        1.957e+01       -1.957e+01  

Degrees of Freedom: 7 Total (i.e. Null);  4 Residual
Null Deviance:      11.09 
Residual Deviance: 5.545    AIC: 13.55

[[2]]

Call:  glm(formula = substitute(outcome ~ i, list(i = as.name(x))), 
    family = binomial, data = df)

**End Snippet**

如您所知,使用 lapplyglm,我创建了 3 个简单的模型,而无需单独完成所有额外工作。您可能会问,当您有简单的代码时,为什么要创建用户定义的函数?我计划运行whilerepeat 循环,它会减少混乱。

感谢您的帮助

【问题讨论】:

    标签: r function lapply


    【解决方案1】:

    我知道仅代码答案已被弃用,但我认为您几乎就在那里并且可以使用轻推来使用 formula 函数(并在替换中包含 'the_response):

     test.func<-function(some_data,the_response,the_predictors)
     {
         lapply(the_predictors,function(a)
             {print(   form<- formula(substitute(resp~i,
                                                 list(resp=as.name(the_response), i=as.name(a)))))
             glm(form, data=some_data,family=binomial)
         })
     }
    

    测试:

    > test.func(df,dependent,independent)
    outcome ~ person
    <environment: 0x7f91a1ba5588>
    outcome ~ hand
    <environment: 0x7f91a2b38098>
    outcome ~ age
    <environment: 0x7f91a3fad468>
    [[1]]
    
    Call:  glm(formula = form, family = binomial, data = some_data)
    
    Coefficients:
        (Intercept)        personDom  personFrancesca       personMary  
          8.996e-17       -1.540e-16        1.957e+01       -1.957e+01  
    
    Degrees of Freedom: 7 Total (i.e. Null);  4 Residual
    Null Deviance:      11.09 
    Residual Deviance: 5.545    AIC: 13.55
    
    [[2]]
    
    Call:  glm(formula = form, family = binomial, data = some_data)
    
    #snipped
    

    【讨论】:

    • 太棒了!我正在慢慢理解substitute 功能,但我很高兴我离正确的方向不远。也很高兴了解formula 函数。谢谢!
    • 您对使用变量组合执行相同的过程有什么建议吗?例如,outcome~person+handoutcome~person+age。我理解不提供编码答案的想法,因此我们将不胜感激。
    • 看起来您应该搜索“所有子集回归”。当然,它是众多名誉扫地的“数据挖掘”方法之一。
    • 是否有理由取消接受复选标记?如果你认为我对统计策略的负面评价是错误的,你应该站出来反驳他们。真正正确讨论它的地方是 CrossValidated.com
    • 为我的无知道歉。我曾看到有人在提出问题以引起注意时会做这样的事情。您的复选标记已正确恢复。感谢您提出解决问题并提供适当的方法。我更新的问题已恢复为我原来的问题,以防止混淆。再次,对于给您带来的不便,我深表歉意。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-27
    • 2023-04-10
    • 2019-09-10
    • 1970-01-01
    • 2020-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多