Как я могу динамически регрессировать и прогнозировать несколько элементов с помощью R? - PullRequest
3 голосов
/ 06 августа 2011

Я пытаюсь написать функцию, которая регрессирует несколько элементов, а затем пытается предсказать данные на основе модели:

"tnt" <- function(train_dep, train_indep, test_dep, test_indep) 
{
    y <- train_dep
    x <- train_indep
    mod <- lm (y ~ x)
    estimate <- predict(mod, data.frame(x=test_indep))
    rmse <- sqrt(sum((test_dep-estimate)^2)/length(test_dep)) 
    print(summary(mod))
    print(paste("RMSE: ", rmse))        
}

Если я пропущу вышесказанное, произойдет сбой:

train_dep = vector1
train_indep <- cbind(vector2, vector3)
test_dep = vector4
test_indep <- cbind(vector5, vector6)
tnt(train_dep, train_indep, test_dep, test_indep)

Изменение вышеуказанного на что-то вроде следующего работает, но я хочу, чтобы это делалось динамически, чтобы я мог передать ему матрицу из любого числа столбцов:

x1 = x[,1]
x2 = x[,2]
mod <- lm(y ~ x1+x2)
estimate <- predict(mod, data.frame(x1=test_indep[,1], x2=test_indep[,2]))

Похоже, это могло бы помочь, но яЯ все еще запутался в остальной части процесса: http://finzi.psych.upenn.edu/R/Rhelp02a/archive/70843.html

Ответы [ 2 ]

2 голосов
/ 06 августа 2011

Попробуйте вместо этого:

tnt <- function(train_dep, train_indep, test_dep, test_indep) 
{   dat<- as.data.frame(cbind(y=train_dep, train_indep))
    mod <- lm (y ~ . , data=dat ) 
    newdat <- as.data.frame(test_indep)
   names(newdat) <- names(dat)[2:length(dat)]

 estimate <- predict(mod, newdata=newdat )
 rmse <- sqrt(sum((test_dep-estimate)^2)/length(test_dep)) 
 print(summary(mod))
 print(paste("RMSE: ", rmse))        
}


Call:
lm(formula = y ~ ., data = dat)

Residuals:
1 2 3 
0 0 0 

Coefficients: (1 not defined because of singularities)
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)        0          0      NA       NA    
V2                 1          0     Inf   <2e-16 ***
V3                NA         NA      NA       NA    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

Residual standard error: 0 on 1 degrees of freedom
Multiple R-squared:     1,  Adjusted R-squared:     1 
F-statistic:   Inf on 1 and 1 DF,  p-value: < 2.2e-16 

[1] "RMSE:  0"
Warning message:
In predict.lm(mod, newdata = newdat) :
  prediction from a rank-deficient fit may be misleading
> 

Предупреждение из-за точного соответствия, которое вы предлагаете

2 голосов
/ 06 августа 2011

Изменено с использованием предложения as.formula в комментариях.Приведенный выше комментарий Романа о передаче всех как одного data.frame и использовании нотации . в формулах, вероятно, является лучшим решением, но я реализовал его в paste, потому что вы должны знать, как использовать paste и as.formula: -).

tnt <- function(train_dep, train_indep, test_dep, test_indep) {
    form <- as.formula(paste("train_dep ~", paste( "train_indep$",colnames(train_indep) ,sep="",collapse=" + " ), sep=" "))
    mod <- lm(form)
    estimate <- predict(mod, data.frame(x=test_indep))
    rmse <- sqrt(sum((test_dep-estimate)^2)/length(test_dep)) 
    print(summary(mod))
    print(paste("RMSE: ", rmse))        
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...