我很困惑为什么这两段代码会返回不同的结果。 在一个方面,循环之间的唯一区别是使用工资$ 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
答案 0 :(得分:0)
是的,这两者的不同之处在于你的循环逻辑。在第一个循环中, age.cut1 是 Wage 数据框中的一列,由''.join(tknstring.split())
限定符证明,在<{>中使用 1}}公式。在第二个循环中, age.cut1 是一个独立的,单独的命名向量,并且在$
公式中未使用。每当使用公式时,列都派生自 data 参数中引用的对象。
不熟悉列出的包和数据结构,在循环之前glm
数据框中很可能存在glm
列(因为第二个循环中的引用没有出错#{1}调用)。但是,它仅在age.cut1
的第一个循环中更新。虽然在第二个循环中分配了类似的命名对象,但原始列数据在Wage
中保持不变。