2016-12-26 70 views
0

我很困惑,为什么两段代码正在返回不同的结果之间的输出差混淆。 在一个环路之间唯一的区别是使用的工资$ age.cut1age.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

我敢打赌,如果你运行两次_same_代码,你不会得到完全相同的结果。交叉验证使用随机选择的点来构建模型以及那些不用于测试的点。如果你运行两次,你会得到不同的随机选择和不同的结果。 – G5W

+0

尝试在每个'cv.err'前面设置'set.seed(1)',看看你是否得到相同的结果。 –

+0

在两个循环中将随机种子设置为1会产生不同的结果。结果与我的初始运行一致。据我所知,两个循环都是一样的,不是吗? – Redeyes10

回答

0

是,这两个的区别使你的循环逻辑有很大的区别。在第一循环中,age.cut1是由$限定符证明在工资数据帧的柱,并glm公式中使用。在第二循环中,age.cut1是一个独立的,单独的命名矢量并且是glm式中未使用的。无论何时使用公式,列都从数据参数中引用的对象派生出来。

不熟悉列出的软件包和数据结构,最有可能的age.cut1柱并在Wage数据帧循环(因为在其第二个循环的glm呼叫参考没有错误发生)之前存在。但是,它仅在cut(Wage$age, i)的第一个循环中更新。尽管在第二个循环中分配了一个类似的命名对象,但原始列数据在glm中保持不变。

+0

感谢您的解释! – Redeyes10