gpt4 book ai didi

r - 使用新数据预测.lm

转载 作者:行者123 更新时间:2023-12-04 17:25:49 28 4
gpt4 key购买 nike

我建了一个 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警告以及来自构建 m1 的原始 data.frame 的预测:
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 中不起作用吗? ?

最佳答案

您正在滥用公式符号,正是这一点导致了您的问题。基本上你的公式:

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))

将评估为具有名为 gc.pc$scores[,1] 的变量的数据框等当您使用 predict()它将在传递给 newdata 的对象中查找具有这些相同名称的变量。争论。

理想情况下,您将创建一个数据对象,其中包含您希望包含在其中的所有变量并具有适当的名称,例如:
fitData <- data.frame(mdldvlp.trim$y, gc.pc$scores[, 1:6], predict(gc.tA))
names(fitData) <- c("trimY", paste("scores", 1:6, sep = ""), "preds")

然后通过以下方式拟合模型:
m1 <- lm(trimY ~ ., data = fitData)

通过提供与用于拟合模型的名称相同的数据框,可以从模型中进行新的预测。因此使用您的 newD :
newD <- data.frame(newComps[1:100,1:6] ,
predict(gc.tA , newdata = mdldvlp[1:100,predKept]))
names(newD) <- c(paste("scores", 1:6, sep = ""), "preds")

然后 predict()
predict(m1 , newdata=newD)

完整示例
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)
fitData <- data.frame(mdldvlp.trim$y, gc.pc$scores[, 1:6], predict(gc.tA))
names(fitData) <- c("trimY", paste("scores", 1:6, sep = ""), "preds")
m1 <- lm(trimY ~ ., data = fitData)
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]))
names(newD) <- c(paste("scores", 1:6, sep = ""), "preds")
predict(m1 , newdata=newD)

关于r - 使用新数据预测.lm,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10240017/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com