2012-08-03 38 views
7

làm việc với một khung dữ liệucảnh báo khi tính giá trị dự đoán

x 
    Date  Val 
    1/1/2012 7 
    2/1/2012 9 
    3/1/2012 20 
    4/1/2012 24 
    5/1/2012 50 
a <- seq(as.Date(tail(x, 1)$Date), by="month", length=5) 
a <- data.frame(a) 
x.lm <- lm(x$Val ~ x$Date) 

x.pre<-predict(x.lm, newdata=a) 

Tôi nhận Erro này:

Warning message: 
'newdata' had 5 rows but variable(s) found have 29 rows 

những gì tôi làm sai?

đây là sản phẩm dput:

dput(x) 
structure(list(Date = structure(c(14610, 14641, 14669, 14700, 
14730, 14761, 14791, 14822, 14853, 14883, 14914, 14944, 14975, 
15006, 15034, 15065, 15095, 15126, 15156, 15187, 15218, 15248, 
15279, 15309, 15340, 15371, 15400, 15431, 15461), class = "Date"), 
    Val = c(45, 51, 56, 56, 59, 60, 60, 60, 64, 65, 75, 73, 74, 
    80, 87, 91, 92, 96, 109, 108, 123, 129, 133, 143, 127, 127, 
    123, 121, 130)), .Names = c("Date", "Val"), row.names = c(NA, 
29L), class = "data.frame") 
+1

Có phải 'z' trong dòng đầu tiên của bạn được coi là' x' không? nếu không chúng ta không biết 'z' là gì. Bạn không gặp lỗi, bạn sẽ nhận được cảnh báo. Ngoài ra, không có gì bạn cho chúng tôi thấy có 29 hàng nên chúng tôi không thể lặp lại điều này. Sử dụng 'dput' để hiển thị cho chúng tôi dữ liệu thực tế của bạn. – Justin

+0

xin lỗi, yest là x. Tôi chỉ cập nhật nó – user1471980

Trả lời

10

tên biến của bạn, như được lưu trữ trong mô hình x.lm, hãy tham khảo x dataframe. Không có biến nào có cùng tên trong a, do đó, nó sẽ sử dụng các biến đó từ x một lần nữa, có thể không phải là những gì bạn muốn, do đó cảnh báo. Bạn có thể làm như sau để luôn luôn sử dụng một biến không đủ tiêu chuẩn đặt tên Date trong mô hình:

a <- seq(as.Date(tail(x, 1)$Date), by="month", length=5) 
a <- data.frame(Date = a) 
x.lm <- lm(Val ~ Date, data=x) 
x.pre<-predict(x.lm, newdata=a) 
+1

hoặc 'x.lm <- lm (Val ~ Ngày, dữ liệu = x); dự đoán (x.lm, newdata = data.frame (Ngày = a)) ' –

+0

@BenBolker, bạn nói đúng, một' với (x,…) 'có lẽ là quá mức cần thiết ở đây. Thay đổi câu trả lời của tôi cho phù hợp. Cảm ơn. – MvG

+0

Ngẫu nhiên, có cách nào để xem xét tham số R hoạt động như thế nào mà không làm tổn thương não của bạn? –

1

bạn data.frame a có một cột tên là a. Bạn đã tạo mô hình của mình với các cột có tên là ValDate vì vậy đó là những gì mà nó đang tìm kiếm.

khi bạn thực hiện tên data.frame a bạn mà cột Date và bạn tốt để đi:

a <- data.frame(Date=a) 

Sau đó, nó chạy mà không có cảnh báo.

mỗi bình luận:

Sửa gọi lm của bạn là:

lm(Val ~ Date, data=x) 
+0

Vẫn đưa ra cảnh báo cho tôi, vì biến này được gọi là 'x $ Date' ở đây. Thậm chí thực sự gọi nó là '" x $ Date "' trong khung dữ liệu dos dường như không đủ. Bạn đã thử nghiệm này chỉ là OP đã viết nó? Nếu có, có thể có sự khác biệt giữa phiên bản R và 2.15.1 của tôi. – MvG

+0

@MvG vâng, bạn nói đúng, tôi đã thay đổi mã OP trong khi không vui và quên. – Justin

0

Nếu bạn không thể làm predict.lm() làm việc, sau đó bạn nên cố gắng viết chức năng của riêng bạn sử dụng function():

yourown_function<- function(predictor1, predictor2,...){intercept+b1*predictor1+b2*predictor2+...} 

sử dụng yourown_function để dự đoán từ bất kỳ dataframe mới:

newvalues<- yourown_function(predictor1=data.frame$predictor1, predictor2=data.frame$predictor2,....) 

sử dụng các giá trị mới, bạn có thể comput e dư, MSE, v.v ...

+0

Loại phông chữ và định dạng này thực sự khó đọc, Dude. – skyline75489

0

Thay vì x.lm < - lm (x $ Val ~ x $ Ngày, dữ liệu = x) sử dụng x.lm < - lm (Val ~ Ngày, dữ liệu = x) . Việc xóa tên tập dữ liệu trước tên biến trong hàm lm sẽ giúp ích.

Các vấn đề liên quan