R语言实现逻辑回归logistic regression的交叉检验cross validation时的问题
(2014-07-07 21:13:33)| 分类: R语言 |
在用glm实现了logistic regreesion 后需要交叉检验检查错误率,这时可用boot
package下的cv.glm函数,专门用于线性回归检验。
然而我在检验时出现了 Error:找不到对象 myformula的情况可以用getAnywhere(fun),查看cv.glm
#前提是已经将库载入:library(boot)或者查看其他的说明资料就会发现。
glm函数用了一种formula stack的东西,存储公式对象,而cv.glm恰恰就使用了glm中存储的这个formula对象,就在myglm$call属性(用attributes/str函数可产看)里, 这种方法很方便很灵活,是直接存储了原代码语句而不是展开存储,也就是如果我如此调用:glm(formula=myformula,data=mydata,,,,), 则myglml=glm(formula=myformula,data=mydata,,,,)而不会将我的myformula展开成y~x1+x2+x3...,这样当调用cv.glm时,直接用了myglm$call存储的公式,所以找不到myformula。我觉得就像用了substitute一样直接以字符串来读原代码而不会分析展开成变量。而且我用了几种方法都没办法展开到call中。
所以最后的办法是直接写了一次myglm$call<-myformula,然后再调用cv.glom(data=mydata, myglm,....)这时不会再出错。可能你会想为什么要用myformla变量赋值而不直接展开写入,那是因为我的公式是改变的,动态生成的,我用paste来生成的公式。
还有一个错误需要记录一下:
就是:Error: $ operator is invalid for atomic vectors
这可能是你本来想要生成一个list或data.frame 可是弄错了在一个字符串上或者c()生成的vector上用了$符号。
希望能帮到大家!
然而我在检验时出现了 Error:找不到对象 myformula的情况可以用getAnywhere(fun),查看cv.glm
glm函数用了一种formula stack的东西,存储公式对象,而cv.glm恰恰就使用了glm中存储的这个formula对象,就在myglm$call属性(用attributes/str函数可产看)里, 这种方法很方便很灵活,是直接存储了原代码语句而不是展开存储,也就是如果我如此调用:glm(formula=myformula,data=mydata,,,,), 则myglml=glm(formula=myformula,data=mydata,,,,)而不会将我的myformula展开成y~x1+x2+x3...,这样当调用cv.glm时,直接用了myglm$call存储的公式,所以找不到myformula。我觉得就像用了substitute一样直接以字符串来读原代码而不会分析展开成变量。而且我用了几种方法都没办法展开到call中。
所以最后的办法是直接写了一次myglm$call<-myformula,然后再调用cv.glom(data=mydata, myglm,....)这时不会再出错。可能你会想为什么要用myformla变量赋值而不直接展开写入,那是因为我的公式是改变的,动态生成的,我用paste来生成的公式。
还有一个错误需要记录一下:
就是:Error: $ operator is invalid for atomic vectors
这可能是你本来想要生成一个list或data.frame 可是弄错了在一个字符串上或者c()生成的vector上用了$符号。
希望能帮到大家!

加载中…