混淆了两个简单循环之间的输出差异

时间:2016-12-26 16:47:48

标签: r

我很困惑为什么这两段代码会返回不同的结果。 在一个方面,循环之间的唯一区别是使用工资$ age.cut1 age.cut1 。差异的意义是什么?

DATA:ISLR包,工资数据

 cv.err <- rep(NA, 10)
 for (i in 2:10){
   Wage$age.cut1 = cut(Wage$age, i)
   fit = glm(wage~age.cut1, data = Wage)
   cv.err[i] = cv.glm(Wage, fit, K = 10)$delta[2]
 }

> cv.err
[1]       NA 1733.646 1681.587 1636.521 1632.931 1623.112 1611.965 1600.903 1609.973
[10] 1607.234 # these are the expected results




 cv.err <- rep(NA, 10)
 for (i in 2:10){
   age.cut1 = cut(Wage$age, i)
   fit = glm(wage~age.cut1, data = Wage)
   cv.err[i] = cv.glm(Wage, fit, K = 10)$delta[2]
 }
 > cv.err
 [1]       NA 1603.255 1608.617 1602.296 1606.265 1606.139 1602.448 1606.063 1605.100
[10] 1606.986

1 个答案:

答案 0 :(得分:0)

是的,这两者的不同之处在于你的循环逻辑。在第一个循环中, age.cut1 Wage 数据框中的一列,由''.join(tknstring.split()) 限定符证明,在<{>中使用 1}}公式。在第二个循环中, age.cut1 是一个独立的,单独的命名向量,并且在$公式中未使用。每当使用公式时,列都派生自 data 参数中引用的对象。

不熟悉列出的包和数据结构,在循环之前glm数据框中很可能存在glm列(因为第二个循环中的引用没有出错#{1}调用)。但是,它仅在age.cut1的第一个循环中更新。虽然在第二个循环中分配了类似的命名对象,但原始列数据在Wage中保持不变。