悬赏 5 个论坛币 未解决
请问该如何用R做多元线性回归模型的留一法交叉验证呢,我尝试了如下代码,可是一直报错。
> dat <- read.csv(file.choose()) #载入数据表格
> lmcv<- function(pIC50=7.86-3.00*BEHe6+12.08*BIC2+2.15*E1u+5.81*HATS7p-0.26*Hy+0.16*L2s-0.65*Mor30e-57.18*R2v_A-91.85*R6v_A+20.62*R7e_A-0.03*RDF080m+35.84*R8p_A, loo = TRUE) {
+ N <- nrow(dat)
+ if (loo == TRUE) {
+ pIC50test <- dat[-1, 14]
+ newrsq <- numeric(N)
+ pIC50pred <- numeric(N)
+ for(i in 1:N){
+ newtrain <- dat[-i,2:13]
+ xtest <- dat[i, 2:13]
+ newfm <- lm(pIC50~BEHe6+BIC2+E1u+HATS7p+Hy+L2s+Mor30e+R2v_A+R6v_A+R7e_A+RDF080m+R8p_A, dat = newtrain)
+ newrsq <- summary(newfm)$r.squared
+ pIC50pred <- predict(newfm, xtest)
+ }
+ }
+ else {
+ m <- 75
+ n <- 1
+ newrsq <- numeric(m)
+ pIC50test <- numeric(m*n)
+ pIC50pred <- numeric(m*n)
+ for (i in 1:m) {
+ j <- sample(N, n, replace = FALSE)
+ newtrain <- dat[j, 2:13]
+ xtest <- dat[j, -1]
+ pIC50test[((i-1) * n + 1): (i * n)] <- dat[j, 14]
+ newfm <- lm(pIC50~BEHe6+BIC2+E1u+HATS7p+Hy+L2s+Mor30e+R2v_A+R6v_A+R7e_A+RDF080m+R8p_A, dat = newtrain)
+ pIC50pred[((i-1) * n + 1): (i * n)] <- predict(newfm, xtest)
+ }
+ }
+ q.squared <- 1 - sum((pIC50test - pIC50pred)^2) / sum((pIC50test - mean(pIC50test))^2)
+ if (loo == TRUE) {
+ SDEP <- sqrt(sum((pIC50test - pIC50pred)^2) / N)
+ }
+ else {
+ SDEP <- sqrt(sum((pIC50test - pIC50pred)^2) / (m * n))
+ }
+ if (loo == TRUE) {
+ return(list(q.squared = q.squared, SDEP = SDEP, newrsq = newrsq))
+ }
+ else {
+ return(list(q.squared = q.squared, SDEP = SDEP))
+ }
+ }
> lmcv(lm(pIC50~BEHe6+BIC2+E1u+HATS7p+Hy+L2s+Mor30e+R2v_A-R6v_A+R7e_A+RDF080m+R8p_A))
Error in eval(predvars, data, env) : 找不到对象'pIC50'
不知道错在了哪里,还请各位大神多多指教。数据材料附上。