如果之前有人问过这个问题,或者我错过了一些明显的事情,我提前道歉。

我有两个数据集,'olddata' 和 'newdata'

set.seed(0) 
olddata <- data.frame(x = rnorm(10, 0,5), y = runif(10, 0, 5), z = runif(10,-10,10)) 
newdata <- data.frame(x = -5:5, z = -5:5) 

我根据旧数据创建模型,并希望根据新数据预测值

mymodel <- lm(y ~ x+z, data = olddata) 
predict.lm(mymodel, newdata) 

但是,我想将“newdata”中的变量范围限制为训练模型的变量范围。

我当然可以这样做:

 newnewdata <- subset(newdata,  
                      x < max(olddata$x) & x > min(olddata$x) & 
                      z < max(olddata$z) & z > max(olddata$z)) 

但这在很多方面都变得棘手。有没有重复性较低的方法来做到这一点?

请您参考如下方法:

似乎您的 newdata 中的所有值都已经在适当的范围内,因此没有任何子集。如果我们扩大 newdata 的范围:

set.seed(0) 
olddata <- data.frame(x = rnorm(10, 0,5), y = runif(10, 0, 5), z = runif(10,-10,10)) 
newdata <- data.frame(x = -10:10, z = -10:10) 
 
newdata 
     x   z 
1  -10 -10 
2   -9  -9 
3   -8  -8 
4   -7  -7 
5   -6  -6 
6   -5  -5 
7   -4  -4 
8   -3  -3 
9   -2  -2 
10  -1  -1 
11   0   0 
12   1   1 
13   2   2 
14   3   3 
15   4   4 
16   5   5 
17   6   6 
18   7   7 
19   8   8 
20   9   9 
21  10  10 

然后我们需要做的就是确定 olddata 的每个变量的范围,然后遍历与 newdata 一样多的 subset 迭代有列:

ranges <- sapply(olddata, range, na.rm = TRUE) 
 
for(i in 1:ncol(newdata)) { 
  col_name <- colnames(newdata)[i] 
 
  newdata <- subset(newdata,  
    newdata[,col_name] >= ranges[1, col_name] & 
      newdata[,col_name] <= ranges[2, col_name]) 
} 
 
newdata 
    x  z 
4  -7 -7 
5  -6 -6 
6  -5 -5 
7  -4 -4 
8  -3 -3 
9  -2 -2 
10 -1 -1 
11  0  0 
12  1  1 
13  2  2 
14  3  3 
15  4  4 
16  5  5 
17  6  6 


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!