如果之前有人问过这个问题,或者我错过了一些明显的事情,我提前道歉。
我有两个数据集,'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