次に、the example that @NPR linked to from statsmethodsにわずかに適合しています。基本的に私はこの例を関数にするように修正しました。
だから、私たちは、線形モデルをフィットし、クロスバリデーション機能を呼び出すことができます前に、
# sample data
set.seed(1234)
x <- rnorm(100)
z <- rnorm(100)
y <- rnorm(100, x+z)
mydata <- data.frame(x,y,z)
からのデータを使用して
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)
}
:
# fit and call function
lmfit <- lm(y ~ x + z, mydata)
k_fold_rsq(lmfit, ngroup=30)
し、得られた生と交差検定Rを得ます正方形:
raw_rsq cv_rsq
0.7237907 0.7050297
警告:raw_rsq
は明らかに正しく、cv_rsq
は私が期待しているボールパーク内にありますが、まだcrosval
の機能についてはまだ調べていません。あなた自身の責任で使用してください。もし誰かからフィードバックがあれば、大歓迎です。また、インターセプトと標準的なメインエフェクト表記があるリニアモデル用にのみ設計されています。
オフトピックでもよい[クロスバリデーション](http://stats.stackexchange.com/)。 –
なぜですか?それは30,000の質問に近い言語[r](http://stackoverflow.com/tags/r/info)で統計的手法を実装する方法です。あなたが望むのであれば、質問の統計要素を削除し、Rの実装に集中することができますか? –
http://www.statmethods.net/stats/regression.htmlをご覧ください。 – NPE