Re: [問題] 如何使用迴圈跑變數命名

作者: andrew43 (討厭有好心推文後刪文者)   2018-03-29 17:37:50
我建議不要生成10個物件,而改成以一個list來做,之後會好操作很多。
下面的例子做3次glm()
Y <- data.frame(
Y1 = rbinom(10000, 1, 0.1),
Y2 = rbinom(10000, 1, 0.5),
Y3 = rbinom(10000, 1, 0.9)
)
X <- data.frame(foo = rnorm(10000), bar = rnorm(10000))
fit <-
apply(
Y,
2,
FUN = function(this.Y) {
glm(this.Y ~ ., family = binomial, data = X)
}
)
# 接下來看看下面的code回傳什麼
exp(coef(fit$Y1))
summary(fit$Y2)
predict(fit$Y3)
# 明白後可以利用lapply()或sapply()做工作了
sapply(fit, coef)
lapply(fit, function(this.fit) {
print(summary(this.fit))
})
sapply(fit, function(this.fit) {
predict(this.fit,
type = "response",
newdata = X)
})
※ 引述《ss12356tw (ss12356tw)》之銘言:
: [問題類型]:
: 程式諮詢(我想用R 做某件事情,但是我不知道要怎麼用R 寫出來)
: [軟體熟悉度]:
: 入門(寫過其他程式,只是對語法不熟悉)
: [問題敘述]:
: 正在用logistic regression的function
: 但因為模型要重複跑9次
: 不知道該如何使用迴圈處理變數命名的部分讓程式碼縮短
: 謝謝大家
: [程式範例]:
: ml_1=glm(group[,1]~.,data=data,family = "binomial")
: p_1=predict.glm(ml_1,newdata=pendigits.tst[,-17], type="response")
: ml_2=glm(group[,2]~.,data=data,family = "binomial")
: p_2=predict.glm(ml_2,newdata=pendigits.tst[,-17], type="response")
: ml_3=glm(group[,3]~.,data=data,family = "binomial")
: p_3=predict.glm(ml_3, newdata=pendigits.tst[,-17],type="response")
: ml_4=glm(group[,4]~.,data=data,family = "binomial")
: p_4=predict.glm(ml_4,newdata=pendigits.tst[,-17], type="response")
: ml_5=glm(group[,5]~.,data=data,family = "binomial")
: p_5=predict.glm(ml_5,newdata=pendigits.tst[,-17], type="response")
: ml_6=glm(group[,6]~.,data=data,family = "binomial")
: p_6=predict.glm(ml_6,newdata=pendigits.tst[,-17], type="response")
: ml_7=glm(group[,7]~.,data=data,family = "binomial")
: p_7=predict.glm(ml_7, newdata=pendigits.tst[,-17],type="response")
: ml_8=glm(group[,8]~.,data=data,family = "binomial")
: p_8=predict.glm(ml_8,newdata=pendigits.tst[,-17], type="response")
: ml_9=glm(group[,9]~.,data=data,family = "binomial")
: p_9=predict.glm(ml_9,newdata=pendigits.tst[,-17], type="response")
: 我將ml_1~9改成i
: 發現沒辦法處理命名的部分
: 想請問該如何修正
: 謝謝
: for(i in 1:9){
: ml_i=glm(group[,i]~.,data=data,family = "binomial")
: p_i=predict.glm(ml_i,newdata=pendigits.tst[,-17], type="response")
: }
: 跑出的錯誤:
: Error in as.data.frame.default(data, optional = TRUE) :
: cannot coerce class ""function"" to a data.frame
: [環境敘述]:
: 3.4.3
: [關鍵字]:
: 變數命名迴圈
:
作者: ss12356tw (ss12356tw)   2018-03-29 20:20:00
謝謝,寫的很清楚,感恩!!
作者: obarisk (OSWALT)   2018-03-30 05:43:00
其實這個情況用for比較好, apply要處理model無法估計的問題
作者: andrew43 (討厭有好心推文後刪文者)   2018-03-30 07:51:00
對,是有點不方便。
作者: ss12356tw (ss12356tw)   2018-04-02 01:48:00
想請問如果改for怎麼寫...比較困擾的是命名部分...for寫不出來
作者: wenbuneatble (文本能吃嗎)   2018-04-03 02:11:00
想請教為何 list會比多物件還好
作者: obarisk (OSWALT)   2018-04-03 10:15:00
list比較好codingoutoutlist <- list()for( i in seq(1, 3) ) {outoutlist[[i]] <- lm()}

Links booklink

Contact Us: admin [ a t ] ucptt.com