我已经建立了一个不使用data=
参数来构建的lm
模型:
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))
现在我想使用
newdata
来预测m1
,并将我的新数据框命名为与上面的lm()
调用中使用的变量匹配。使用
newComps
作为我的新的gc.pc
(就像gc.tA
预测一样,使用新的数据框进行预测没有任何问题),我尝试了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
警告以及建立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后续:
感谢大家的回答。我理解首先创建一个具有适当命名的预测变量的数据框将使事情变得更容易。 我明白。我的问题是,如果建模数据框确实评估为带有名称为gc.pc $ scores [,1]
等的变量的数据框,则为什么上面使用的命名“策略”在predict.lm
中不起作用?换句话说,lm
是否真的使用gc.pc $ scores [,1]
等来评估其建模数据框? 如果是这样,那么上面的重命名策略是否会在predict.lm
中起作用呢?
mdldvlp.trim$y
、gc.pc$scores
和predict(gc.tA)
合并成一个数据框,在创建m1
时使用?这样,您就可以在lm
中使用data
参数,编写仅包含names(data)
的公式,并避免为newD
分配可能无效的名称。 - BenBarnes