看板 R_Language 關於我們 聯絡資訊
※ 引述《tai34 (tai)》之銘言: : 各位大大好 : 想請問 lapply fuction 是甚麼意思 : 已用 lapply 當關鍵字查詢跟查 R 內的相關說明 : 但不確定是甚麼意思 : 是利用不同的 x 運算在相同的 FUNCITON 嗎? : 懇請白話一點,謝謝!!! lapply 用法很多 其實可以想像成list的迴圈版本 a = lapply(1:10, function(i) i) 等同於 a = list(NULL) for (i in 1:10) a[[i]] = i 或是 L 是一個list a = lapply(L, function(l) ~~some function~~) 等同於 a = list(NULL) for (i in 1:10) a[[i]] = some function ( L[[i]] ) 我想到的簡單例子是cross-validation X = matrix(rnorm(1000),ncol = 10) # 10 covariates B = 1:11 Y = cbind(1,X) %*% B + rnorm(100) dat = data.frame(X, Y) X.i = lapply(1:nrow(X), function(i) dat[-i,]) lm.i = lapply(X.i, function(ll) lm(Y~., data = ll)) yhat.i = lapply(1:nrow(X), function(j) predict(lm.i[[j]], newdata =dat[j,])) yhat.i = Reduce(c, yhat.i) MSE.i = (y-yhat.i)^2 這樣的procedure可以用在選哪一個模型最佳等。 PS: 其實這個例子只是提供想法,非好的利子QQ 第二個例子(ridge regression 挑選panelty term大小): ## Data data(longley) X <- as.matrix(longley[,1:5]) Y <- as.matrix(longley[,7]) ## Normalization norm <- function(a) (a-mean(a))/sd(a) Y.N <- apply(Y, 2, norm) X.N <- apply(X, 2, norm) D <- cbind(Y.N, X.N) n <- nrow(X.N) p <- ncol(X.N) ## Ridge regression, given lambda beta.R <- function(Y, X, nc, lambda) solve(t(X)%*%X + lambda*diag(nc),t(X)%*%Y) ## cross validation, single CPU version m <- 1001 lambda <- seq(0, 1, length=m) CV <- sapply(1:m, function(j){ out <- sapply(1:n, function(i) beta.hat <- beta.R(Y.N[-i,], X.N[-i,], p, lambda[j])) out <- mean((Y.N - diag(X.N%*%out))^2) }) plot(lambda, CV, type='l', xlab=expression(lambda), ylab='CV') lambda.opt <- lambda[which(CV == min(CV))] beta.opt <- beta.R(Y.N, X.N, p, lambda.opt) inner.loop <- function(j){ A <- apply(matrix(1:m,m,1), 1, function(i) beta.hat <- beta.R(Y.N[-i], X.N[-i,], p, lambda[j])) out <- mean((Y.N - diag(X.N%*%A))^2) return(out) } CV <- sapply(seq(along=Y.N), inner.loop) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.116.152.221
tai34:喔喔喔! 感謝! 12/13 01:49
tai34:看了你的解答跟試了很多次,大概懂他的意思了! 謝謝 12/13 04:03