我试图创建一个创建模型的函数,并可以预测任何给定data.frame(例如mtcars)的目标变量。
#Function to create a model for predicting a target variable
myRegModel = function(myFormula,myData){
sampleIndex = sample(1:nrow(myData),size= 0.7*nrow(myData), replace=FALSE)
myTraining = myData[sampleIndex, ]
myTesting = myData[-sampleIndex, ]
myDataFit = lm(myFormula, data = myTraining)
myTesting$predVar <- predict(myDataFit, myTesting)
myTesting$predErr <- abs(((myTesting$mpg - myTesting$predVar)/ myTesting$mpg)*100)
print(cor(myTesting$mpg, myTesting$predVar))
print(mean(myTesting$predErr))
print(summary(myDataFit))
}
myRegModel(mpg ~ ., myMtCars)
但是,在找到上述预测误差和相关值的情况下,我已经对目标变量(mpg)进行了硬编码。因为,我将函数中的目标变量作为第一个参数传递,有没有办法可以提取我的目标变量并动态分配给myTesting data.frame。 (例如,myTesting $ target)
答案 0 :(得分:2)
为了扩展@RuiBarradas方法,我们可以使用all.vars
直接从公式中提取变量,然后使用[[
作为@RuiBarradas建议
myRegModel <- function(myFormula,myData){
nm1 <- all.vars(myFormula)[1]
sampleIndex <- sample(seq_len(nrow(myData)),size= 0.7*nrow(myData), replace=FALSE)
myTraining <- myData[sampleIndex, ]
myTesting <- myData[-sampleIndex, ]
myDataFit <- lm(myFormula, data = myTraining)
myTesting$predVar <- predict(myDataFit, myTesting)
myTesting$predErr <- abs(((myTesting[[nm1]] -
myTesting$predVar)/ myTesting[[nm1]])*100)
myTesting
}
myMtCars <- mtcars
myRegModel(mpg ~ ., myMtCars)
# mpg cyl disp hp drat wt qsec vs am gear carb predVar predErr
#Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1 26.43998 15.964845
#Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1 20.84027 2.615556
#Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1 20.30464 12.180316
#Merc 280 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4 18.10403 5.708192
#Lincoln Continental 10.4 8 460.0 215 3.00 5.424 17.82 0 0 3 4 11.22245 7.908153
#Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1 27.88747 13.927557
#Toyota Corona 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1 25.47992 18.511254
#Pontiac Firebird 19.2 8 400.0 175 3.08 3.845 17.05 0 0 3 2 16.11037 16.091819
#Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2 25.64254 15.649525
#Maserati Bora 15.0 8 301.0 335 3.54 3.570 14.60 0 1 5 8 11.47808 23.479490
答案 1 :(得分:1)
是的,有办法做你想做的事。您只需对data.frame
的列使用不同的表示法。一般来说,在交互模式下,使用dat$col
即可。但是当你编写一个函数时,使用dat[[col]]
要好得多。这些是完全相同的向量,但后者更灵活。
因此,在您的情况下,这将成为myTesting[[target]]
。