在 R for 循环中将字符串作为变量名称传递,但在结果中保留名称

Passing strings as variables names in R for loop, but keeping names in results

好的,我正在研究 R 中的一个愚蠢的玩具问题(实际上是 edx 课程的一部分),运行 一堆双变量 logits 并查看 p 值。我正在尝试通过将杂务作为 for 循环而不是作为一堆单独的模型来为我的数据处理实践添加一些编码实践。所以我从数据框中提取了我想要的变量名,将其插入一个向量中,然后将该向量传递给带有 for 循环的 glm()。

经过大约一个半小时的搜索和修改以处理不可避免的可变长度错误,我意识到 R 将变量向量的元素解释为字符串而不是变量名。解决了这个问题,最后的工作循环如下:

for (i in 1:length(dumber)) { 
  print(summary(glm(WorldSeries ~ get(dumber[i]) , data=baseball, family=binomial)))
} 

其中 dumber 是自变量名称的向量,WorldSeries 是因变量。

那太棒了...除了一个小问题。控制台输出是一堆模型摘要,这是我想要的,但摘要没有用变量名称标记。相反,它们只是标有来自 for 循环的代码!例如,这是我的小循环所经历的两个变量的摘要:

称呼:
glm(公式 = WorldSeries ~ get(dumber [i]),家庭 = 二项式,
    数据 = 棒球)

偏差残差:
    最小值 1Q 中值 3Q 最大值
-0.5610 -0.5209 -0.5088 -0.4902 2.1268

系数:
               估计标准。错误 z 值 Pr(>|z|)
(截距)-0.08725 6.07285 -0.014 0.989
得到(笨蛋[i])-4.65992 15.06881 -0.309 0.757

(二项式族的分散参数取为 1)

    零偏差:113 个自由度上的 84.926
剩余偏差:112 个自由度上的 84.830
  (130 个观察因缺失而被删除)
AIC:88.83

Fisher 评分迭代次数:4


称呼:
glm(公式 = WorldSeries ~ get(dumber [i]),家庭 = 二项式,
    数据 = 棒球)

偏差残差:
    最小值 1Q 中值 3Q 最大值
-0.9871 -0.8017 -0.5089 -0.5089 2.2643

系数:
               估计标准。错误 z 值 Pr(>|z|)
(截距)0.03868 0.43750 0.088 0.929559
得到(笨蛋[i])-0.25220 0.07422 -3.398 0.000678 ***
---
符号。代码:0‘***’0.001‘**’0.01‘*’0.05‘.’0.1‘’1

(二项式族的分散参数取为 1)

    零偏差:243 个自由度上的 239.12
剩余偏差:242 个自由度上的 226.96
AIC:230.96

Fisher 评分迭代次数:4

这显然是没有希望的,尤其是当变量向量的元素数量增加时。我敢肯定,如果我对面向对象编程的了解比我多得多,我就能够创建某种复杂的对象,该对象的元素与模型摘要相匹配,或者直接修改摘要将 dumber 的元素插入到它当前只读取 "get(dumber[i])" 的位置。但我目前对 OOP 了如指掌(我正在学习!它很慢!)。那么有人想给我线索吗?谢谢!

您可以这样做(一次只将结果和预测变量列发送到 glm):

for (i in 1:length(dumber)) { 
  print(summary(glm(WorldSeries ~ . , data=baseball[, c("WorldSeries",  dumber[i])], 
                                       family=binomial)))
} 

您也可以这样做(用 'dumber' 的值标记输出):

for (i in 1:length(dumber)) { print( paste0("Current predictor is ...", dumber))
  print(summary(glm(WorldSeries ~ get(dumber) , data=baseball, family=binomial)))
} 

随着您在精通 R 的道路上前进,您可能想要构建一个摘要对象列表,然后使用 lapplyprintcat 您定制的输出。