Vì vậy, điều sau đây là một chút thích ứng với the example that @NPR linked to from statsmethods. Về cơ bản tôi đã điều chỉnh ví dụ để biến nó thành một hàm.
library(bootstrap)
k_fold_rsq <- function(lmfit, ngroup=10) {
# assumes library(bootstrap)
# adapted from http://www.statmethods.net/stats/regression.html
mydata <- lmfit$model
outcome <- names(lmfit$model)[1]
predictors <- names(lmfit$model)[-1]
theta.fit <- function(x,y){lsfit(x,y)}
theta.predict <- function(fit,x){cbind(1,x)%*%fit$coef}
X <- as.matrix(mydata[predictors])
y <- as.matrix(mydata[outcome])
results <- crossval(X,y,theta.fit,theta.predict,ngroup=ngroup)
raw_rsq <- cor(y, lmfit$fitted.values)**2 # raw R2
cv_rsq <- cor(y,results$cv.fit)**2 # cross-validated R2
c(raw_rsq=raw_rsq, cv_rsq=cv_rsq)
}
Vì vậy, bằng cách sử dụng dữ liệu từ trước
# sample data
set.seed(1234)
x <- rnorm(100)
z <- rnorm(100)
y <- rnorm(100, x+z)
mydata <- data.frame(x,y,z)
Chúng ta có thể phù hợp với một mô hình tuyến tính và gọi hàm kiểm chứng chéo:
# fit and call function
lmfit <- lm(y ~ x + z, mydata)
k_fold_rsq(lmfit, ngroup=30)
Và có được kết quả r liệu và cross-xác nhận -square:
raw_rsq cv_rsq
0.7237907 0.7050297
Nhớ lại: Mặc dù raw_rsq
rõ ràng là chính xác và cv_rsq
nằm trong công viên bóng mà tôi mong đợi, lưu ý rằng tôi chưa kiểm tra chính xác chức năng của crosval
. Vì vậy, sử dụng có nguy cơ của riêng bạn và nếu bất cứ ai có bất kỳ thông tin phản hồi, nó sẽ được chào đón nhất. Nó cũng chỉ được thiết kế cho các mô hình tuyến tính với một đánh chặn và tiêu chuẩn hiệu ứng chính ký hiệu.
Có thể bị tắt chủ đề .. và tốt [đã được xác thực chéo] (http://stats.stackexchange.com/). –
Tại sao? Đó là về cách thực hiện một kỹ thuật thống kê trong ngôn ngữ [r] (http://stackoverflow.com/tags/r/info) có gần 30.000 câu hỏi. Nếu bạn thích, tôi có thể loại bỏ các yếu tố thống kê của câu hỏi và chỉ tập trung vào triển khai R? –
Hãy xem http://www.statmethods.net/stats/regression.html – NPE