2012-01-27 4 views
43

I posted earlier todaypredict 기능을 사용하면서 오류가 발생했습니다. 나는 그것을 바로 잡을 수 있었고, 나는 올바른 길에 있다고 생각했다.Predict() - 아마도 이것을 이해하지 못하고 있습니다

나는 다수의 관측치 (실제)가 있으며, 내가 추측하거나 예측하고자하는 몇 가지 데이터 포인트가 있습니다. lm을 사용하여 모델을 만든 다음 predict을 예상 값 입력으로 사용할 실제 값과 함께 사용하려고했습니다.

이 코드는 모든 내 이전 게시물에서 반복하지만, 여기있다 :

df <- read.table(text = ' 
    Quarter Coupon  Total 
1 "Dec 06" 25027.072 132450574 
2 "Dec 07" 76386.820 194154767 
3 "Dec 08" 79622.147 221571135 
4 "Dec 09" 74114.416 205880072 
5 "Dec 10" 70993.058 188666980 
6 "Jun 06" 12048.162 139137919 
7 "Jun 07" 46889.369 165276325 
8 "Jun 08" 84732.537 207074374 
9 "Jun 09" 83240.084 221945162 
10 "Jun 10" 81970.143 236954249 
11 "Mar 06" 3451.248 116811392 
12 "Mar 07" 34201.197 155190418 
13 "Mar 08" 73232.900 212492488 
14 "Mar 09" 70644.948 203663201 
15 "Mar 10" 72314.945 203427892 
16 "Mar 11" 88708.663 214061240 
17 "Sep 06" 15027.252 121285335 
18 "Sep 07" 60228.793 195428991 
19 "Sep 08" 85507.062 257651399 
20 "Sep 09" 77763.365 215048147 
21 "Sep 10" 62259.691 168862119', header=TRUE) 

str(df) 
'data.frame': 21 obs. of 3 variables: 
$ Quarter : Factor w/ 24 levels "Dec 06","Dec 07",..: 1 2 3 4 5 7 8 9 10 11 ... 
$ Coupon: num 25027 76387 79622 74114 70993 ... 
$ Total: num 132450574 194154767 221571135 205880072 188666980 ... 

코드 :

model <- lm(df$Total ~ df$Coupon, data=df) 

> model 

Call: 
lm(formula = df$Total ~ df$Coupon) 

Coefficients: 
(Intercept) df$Coupon 
    107286259   1349 

코드를 예측 (이전의 도움 기준) :

(다음은 예측 된 값을 얻기 위해 사용하려는 예측 값입니다.)

Quarter = c("Jun 11", "Sep 11", "Dec 11") 
Total = c(79037022, 83100656, 104299800) 
Coupon = data.frame(Quarter, Total) 

Coupon$estimate <- predict(model, newdate = Coupon$Total) 
내가 모델이 21 명 관찰했다 구축하는 데 사용

Error in `$<-.data.frame`(`*tmp*`, "estimate", value = c(60980.3823396919, : 
    replacement has 21 rows, data has 3 

내 원래 데이터 프레임 : 나는 것을 실행할 때

지금,이 오류 메시지가 표시됩니다. 나는 현재 모델을 기반으로 3 가지 값을 예측하려고합니다.

이 기능을 제대로 이해하지 못하거나 코드에 오류가 있습니다.

도움을 받으실 수 있습니다.

+1

당신은 거의 확실히't이 작동시킬 수 lm'하기 위해'data' 인수를 사용할 필요가 새로운 데이터 세트를 생성하지 않고 둥지에 두 개의 기능입니다, 즉'모델 <- LM (총 ~ 쿠폰 , data = df)'이다. 그럼 나는'Coupon $ estimate <- predict (model, newdata = Coupon) $ Total'을 제안 할 것이다. –

+0

@BenBolker 나는 첫 번째 부분에 동의한다. 나는'predict (model, newdata = Coupon)'가 그가 원하는 것이어야한다고 생각한다. – joran

+0

@ joran 네, 맞습니다. –

답변

65

먼저

감사합니다, 당신은

model <- lm(Total ~ Coupon, data=df) 

하지model <-lm(df$Total ~ df$Coupon, data=df) 사용하고 싶습니다.

두 번째로 lm(Total ~ Coupon)이라고 말하면 Total을 응답 변수로 사용하고 Coupon을 예측 자로 사용하는 모델을 피팅합니다. 즉, 모델의 형식은 Total = a + b*Coupon이며 ab의 계수를 추정해야합니다. 응답은 ~의 왼쪽과 오른쪽의 예측 변수에 적용됩니다. 당신이 모델에 대한 예측 값을 제공하기 위해 R을 요청할 때이 때문에

는, 당신은 새로운 예측 값의 집합, 즉 Coupon의 새 값이 아닌 Total를 제공해야합니다.

셋째, newdata의 사양으로 판단하면 Coupon의 모델을 실제로 Total에 맞게 모델링 한 것 같습니다. 다른 방법은 아닙니다. 이를 수행하려면 :

model <- lm(Coupon ~ Total, data=df) 
new.df <- data.frame(Total=c(79037022, 83100656, 104299800)) 
predict(model, new.df) 
+0

나는 공식이 거꾸로 있다고 생각한다. 또한,'new.df'는'Total' 대신'Coupon'을 포함해야합니다. 또한, 원래의 질문에 대한 나의 대답은 잘 작동한다;) –

+1

@ JoshO'Brien : OP가 게시 한 새 데이터에서 벗어나, '합계'값을 지정한다. 그것은 그가'Coupon'을 예측하는 모델을 실제로 따르고 있음을 암시합니다. –

+0

하지만 그는 항상 포뮬러의 왼쪽에 '합계'를 넣었습니다. 게시물의 첫 줄에 나와 있습니다! 내가 믿을 수 없을 정도로 혼란하지 않으면, '쿠폰'은 예측자를위한 것입니다. (당신이 겪고 자하는 개념만큼이나 중요하지는 않습니다.) –

7

감사합니다. 홍, 정확히 내가 겪어 본 문제였습니다. 오류가 발생하면 행 수가 잘못되었음을 알 수 있지만 문제는 실제로 매개 변수의 잘못된 이름으로 끝나는 명령을 사용하여 모델이 학습 된 것입니다.

이것은 정말 중요한 부분으로, 작품 등에서는 분명하지 않습니다. 튜토리얼의 일부는 lm([email protected]$Palmitic)과 같은 행을 만드는 것을 참조합니다 - 올리브 $ 영역이 아닌 영역의 변수 이름으로 끝나기 때문에 anewdata<-data.frame(Palmitic=2)을 사용하여 항목을 만드는 것은 사용할 수 없습니다. lm([email protected],data=olive)을 사용하면 변수 이름이 정확하고 예측이 작동합니다.

진짜 문제는 오류 메시지가 모든 문제를 표시하지 않는다는 것입니다 :

경고 메시지 : 'anewdata는'X에게 행

이 발견 한 행하지만 변수 (들) 있었다
+0

고마워요, 이것은 매우 중요한 요지입니다. 제가 언급 한 오류가 있습니다.Hong 님의 답변에 대한 답변을 적용하려면 : new.df의 열이 원래 데이터 프레임과 동일한 열 이름 인 "Total"으로 이름이 지정되지 않은 경우 오류가 발생합니다. 따라서 새 데이터의 열 이름이 원래 모델의 예측 자와 동일한 지 확인하는 것이 중요합니다. – NeonBlueHair

+0

답변에 플래그가 지정되지 않았습니다. '@'연산자를 사용하면 S4 객체를 다루고 있으며 원래의 질문이나 대답과 아무런 관련이 없음을 나타냅니다. 적절하게 대답 된보다 간단한 문제로 어려움을 불특정 숙제 문제와 혼동하게되었습니다. –

2

newdata 대신 newdate를 사용하여 예측 코드에서 한 번 확인하십시오. 그리고 그냥 Coupon$estimate <- predict(model, Coupon) 사용할 수 있습니다.

1

오류를 피하기 위해 새로운 데이터 세트에 대한 중요한 점은 독립 변수의 이름입니다. 그것은 모델에서보고 된 것과 동일해야합니다. 또 다른 방법은

model <- lm(Coupon ~ Total, data=df) 
predict(model, data.frame(Total=c(79037022, 83100656, 104299800))) 
관련 문제