2015-01-27 2 views
0

new.y = predict(model, newx = new.x), new.y의 길이가 new.xR에, 수익률에게 잘못된 길이

코드의 행 길이 다른 을 예측하는 것은 여기에 있습니다 :

install.packages('ISLR') 
library(ISLR) 

fix(Hitters) # load data 
Hitters = na.omit(Hitters) # remove NA 

x = model.matrix(Salary ~ ., Hitters)[ , -1] 
y = Hitters$Salary 

set.seed(1) 
train = sample(1:nrow(x), nrow(x)/2) # random sampling 
test = (-train) 

lm.fit = lm(y ~ x, subset=train) 
lm.pred = predict(lm.fit, newx = x[test,]) 

dim(x[test,]) # output 132*19 
length(lm.pred) # output 131 
length(y[test]) # output 132 

아무도 왜 길이 알고 있나요 틀렸어? 감사!

업데이트 : 실수는 newx = x[test, ]입니다. predict에 의해 인식되지 않았습니다. 감사합니다! 은 더 분명하게하려면 다음과 같은 일을해야 1, 2 코드에서 test을 정의

install.packages('ISLR') 
library(ISLR) 

fix(Hitters) # load data 
Hitters = na.omit(Hitters) # remove NA 

x = model.matrix(Salary ~ ., Hitters)[ , -1] 
y = Hitters$Salary 

set.seed(2) 
train = sample(1:nrow(x), 150) # random sampling (specify size for testing) 
test = (1:nrow(x))[-train] 


lm.fit = lm(y ~ x, subset=train) 
lm.pred = predict(lm.fit, newx = x[test,]) 
dim(x[test,]) # output 113 19 
length(lm.pred) # output 150 - still using training data 


lm.fit = lm(Salary ~ ., data = Hitters, subset = train) 
lm.pred = predict(lm.fit, newdata = Hitters[test,]) 
dim(x[test,]) # output 113 19 
length(lm.pred) # output 113 

방법. 테스트 :

x = c('A','B','C','D','E') 
set.seed(2) 
n = length(x) 
train = sample(1:n, n/2) # random sampling 
test = -train 
test # output -1 -3 
x[test] # output "B" "D" "E" 

test = (1:n)[-train] 
test # output 2 4 5 
x[test] # output "B" "D" "E" 
+2

'newx'은'홍보에 대한 유효한 옵션이 아닙니다 edict.lm'. 'x [test,]'는 사용되지 않습니다. –

+0

또한'test'의 값을 확인 했습니까? –

+0

안녕하세요 @ 파스칼, 고마워요! 'newx'는 사용되지 않았습니다 ... –

답변

1

당신이 간단하게 할 수 있습니다

library(ISLR) 

Hitters <- na.omit(Hitters) # remove NA 

set.seed(1) 
train <- sample(1:nrow(Hitters), nrow(Hitters)/2) # random sampling 
test <- (1:nrow(Hitters))[-train] # your definition of test was incorrect 

lm.fit <- lm(Salary ~ ., data = Hitters, subset = train) 
lm.pred <- predict(lm.fit, newdata = Hitters[test,]) 

dim(Hitters[test,]) # output 132*20 
length(lm.pred) # output 132 
+0

'test'가 필요합니까?'newdata = Hitters [-train,]'을'predict'에서 사용하십시오. 그러나 중요하지는 않습니다. – user20650

+0

예, 맞습니다. 나는 OP의 실수를 강조하고 싶었지만, 귀하의 발언은보다 직접적인 방법입니다. –

+0

안녕하세요 @ 파스칼, 나는 무언가를 시도하고 아마도 두 가지 방법이 동일하게 작동한다고 생각합니다. 'x = c ('A ','B ','C ','D ','E ') 집합.시드 (2) N = nrow (X) = 샘플 열차 (1 : N, N/2) # 랜덤 샘플링 테스트 = 테스트 -train X [시험] = (1 시험 : 길이 (X)) [- train] 테스트 x [test]'도움을 주셔서 감사합니다 ~ –

0

시도가 같이 인수 newdata에 data.frame을 제공 :

lm.pred <- predict(lm.fit, 
        newdata=data.frame(x=x[test,],y=0)) 

은 또한, 나는 당신이하고있는 생각 인수 subset가하고있는 모르겠어요. 내가 대신 같이 lm로 호출에서 인수 data을 제공 할 것이다 :

lm.fit = lm(y ~ x, 
      data=data.frame(x=x,y=y)[train,]) 
+1

'y'는 여기에 필요 없습니다. –

+0

@Pascal 정말요? 예측 호출에서 data.frame에서 제거하면 모형에 맞는 원래 데이터로 되돌아갑니다. – Jthorpe

+0

동일한 결과가 나옵니다. –

0

을이 시도 : 나는 lm.pred의 길이의 차이를 생각

install.packages('ISLR') 
library(ISLR) 

fix(Hitters) # load data 
Hitters = na.omit(Hitters) # remove NA 

x = Hitters[,-1] 
y = Hitters$Salary 

set.seed(1) 
train = sample(1:nrow(x), nrow(x)/2) # random sampling 
test_data <- x[-train,] 
y_test <- y[-train] 
y_train<-y[train] 
train_data <- data.frame(Y= y[train],x[train,]) 

lm.fit = lm(Y ~ ., train_data) 
lm.pred = predict(lm.fit, newx = test_data) 

dim(test_data) # output 161*19 
length(lm.pred) # output 130 
length(y_test) # output 161 

는 Y의 null 값 때문이다