我在lm
不使用data=
参数的情况下构建了一个模型:
m1 <- lm( mdldvlp.trim$y ~ gc.pc$scores[,1] + gc.pc$scores[,2] + gc.pc$scores[,3] +
gc.pc$scores[,4] + gc.pc$scores[,5] + gc.pc$scores[,6] + predict(gc.tA))
现在我想预测m1
使用newdata
并命名我的新 data.frame 以匹配lm()
上面调用中使用的变量。
作为newComps
我的新gc.pc
的(与gc.tA
预测一样,它是使用新的 data.frame 预测的,没有任何问题),我已经尝试过
newD <- data.frame( newComps[1:100,1:6] ,
predict(gc.tA , newdata = mdldvlp[1:100,predKept]))
names(newD) <- names(m1$coefficients)[-1]
names(newD) <- names(m1$model)[-1]
names(newD) <- c( "gc.pc$scores[, 1]" , "gc.pc$scores[, 2]" , "gc.pc$scores[, 3]" ,
"gc.pc$scores[, 4]" , "gc.pc$scores[, 5]" , "gc.pc$scores[, 6]" ,
"predict(gc.tA)" )
names(newD) <- c( "gc.pc$scores[,1]" , "gc.pc$scores[,2]" , "gc.pc$scores[,3]" ,
"gc.pc$scores[,4]" , "gc.pc$scores[,5]" , "gc.pc$scores[,6]" ,
"predict(gc.tA)" )
不幸的是,predict.lm
不接受上述命名策略并返回可怕的newdata
警告以及来自构建的原始 data.frame 的预测m1
:
Warning message:
'newdata' had 100 rows but variable(s) found have 1414 rows
我应该如何命名newD
列以使predict
调用正常工作?谢谢。
下面的代码重现了这个问题:
require(rpart)
set.seed(123)
X <- matrix(runif(200) , 20 , 10)
gc.pc <- princomp(X)
y <- runif(20)
mdldvlp.trim <- data.frame(y,X)
names(mdldvlp.trim) <- c("y",paste("x",1:10,sep=""))
predKept <- paste("x",1:10,sep="")
gc.tA <- rpart( y ~ . , data = mdldvlp.trim)
m1 <- lm( mdldvlp.trim$y ~ gc.pc$scores[,1] + gc.pc$scores[,2] + gc.pc$scores[,3] +
gc.pc$scores[,4] + gc.pc$scores[,5] + gc.pc$scores[,6] + predict(gc.tA))
mdldvlp <- data.frame(matrix(runif(2000) , 200 , 10))
names(mdldvlp) <- predKept
newComps <- predict( gc.pc , newdata=mdldvlp )
newD <- data.frame( newComps[1:100,1:6] ,
predict(gc.tA , newdata = mdldvlp[1:100,predKept]))
# enter newD naming strategy here
predict( m1 , newdata=newD )
4/20 跟进:
谢谢大家的回答。我知道通过首先使用正确命名的预测器创建一个 data.frame 会更容易。我明白那个。我的问题是,如果建模数据框确实评估为具有变量命名gc.pc$scores[,1]
等的数据框,那么为什么上面使用的命名“策略”不能使用predict.lm
?换句话说,真的用等等来lm
评估它的建模数据框吗?gc.pc$scores[,1]
如果是这样,上面的重命名策略不会起作用predict.lm
吗?