जिस प्रश्न को मैं हल करने का प्रयास कर रहा हूं वह है "मैं कोड की एक स्वचालित श्रृंखला कैसे बना सकता हूं जो एक सामान्य रैखिक मॉडल (glm) फिट करने के लिए डेटा सेट से वांछित कॉलम हेडर नाम खींचेगा?" मेरे पास 8 चर के साथ एक डेटा सेट है; हालांकि, मैं उनमें से केवल 3 का उपयोग सत्यापन को पार करने और "सर्वश्रेष्ठ" मॉडल खोजने के लिए करना चाहता हूं। यहाँ मैं क्या लेकर आया हूँ:

library(boot)
salary <- read.csv("salary_data.csv")
vars <- colnames(salary[c(2,3,7)])
nvars <- length(vars)
list.to.expand = vector(mode = "list", length = nvars)
for (i in 1:nvars){
  list.to.expand[[i]]=c(0,1)
}
model.spec.matrix <- expand.grid(list.to.expand)
vars
model.spec.matrix
names(model.spec.matrix) <- vars
vars.to.use <- model.spec.matrix[2,]
vars.to.use <- as.numeric(vars.to.use)
cn <- c()
for (i in 1:nrow(model.spec.matrix)){
  if(i==1){cn <- colnames(model.spec.matrix[sapply(model.spec.matrix[i,], function(x) x > 0)]) 
  }
}
print(cn)
paste(cn, collapse = "+")
glm.out = glm(paste("LogACG~",paste(cn,collapse = "+"),sep = ""), family = gaussian, data = salary)
cv.err = cv.glm(salary, glm.out, K = 10)$delta[1]

मेरी समस्या लूप के लिए है। मैंने एक लूप बनाने की कोशिश की है जो "vars" से "model.use" में मानों को जोड़ देगा, लेकिन मुझे लगता है कि यह मैट्रिक्स में दूसरी पंक्ति से पहले पढ़ने के लिए प्रतीत नहीं होता है। कोई सुझाव? धन्यवाद

0
user12775860 20 अप्रैल 2020, 23:33

1 उत्तर

सबसे बढ़िया उत्तर

ऐसा लगता है कि यहां कई चीजें चल रही हैं।

आपने LogACG को अपनी दूसरी-से-अंतिम पंक्ति ("LogACG~ में व्याख्यात्मक चर बना दिया है, लेकिन यह vars में से एक भी है जो अंततः model.vars में समाप्त होता है क्योंकि vars <- colnames(salary[c(2,3,7)]), तो यह सही नहीं है।

अगला आपका दूसरा for लूप model.spec.matrix की पंक्तियों के माध्यम से पुनरावृत्त होना चाहिए, अर्थात।

for(i in 1:nrow(model.spec.matrix)){

और उस पंक्ति द्वारा इंगित कॉलम नामों (चर) को प्रोग्रामेटिक रूप से कैप्चर करने के लिए जो आप कर सकते थे

cn <- colnames(model.spec.matrix[sapply(model.spec.matrix[i,], function(x) x > 0)])

लूप के भीतर। आपको लूप के अंदर glm और cv.glm को भी घुमाना चाहिए।

हालांकि, यह हर बार glm.out और cv.err को अधिलेखित कर देगा, इसलिए आप उन्हें खाली सूचियों के रूप में बनाना चाहेंगे और प्रत्येक पुनरावृत्ति में सूची को जोड़ेंगे।

तो अंतिम उत्पाद इस तरह दिखेगा:

# Since you can't use LogACG to explain itself, 
#    suppose you meant to use Engineering as a candidate X
vars <- colnames(salary[c(2,3,8)])

# Make your grid
model.spec.matrix        <- expand.grid(list.to.expand)
names(model.spec.matrix) <- vars

glm.out <- list(rep(NA, nrow(model.spec.matrix)))
cv.err  <- list(rep(NA, nrow(model.spec.matrix)))

for(i in 1:nrow(model.spec.matrix)){
  cn <- colnames(model.spec.matrix[sapply(model.spec.matrix[i,], function(x) x > 0)])
  if(length(cn) == 0){cn <- "."}  
  tmp        <- glm(as.formula(paste("LogACG~",paste(cn,collapse = "+"),sep = "")), family = gaussian, data = salary)
  glm.out[i] <- capture.output(tmp$formula)
}
# > glm.out
# [[1]]
# [1] "LogACG ~ ."
# 
# [[2]]
# [1] "LogACG ~ Rank_Code"
# 
# [[3]]
# [1] "LogACG ~ Gender"
# 
# [[4]]
# [1] "LogACG ~ Rank_Code + Gender"
# 
# [[5]]
# [1] "LogACG ~ Engineering"
# 
# [[6]]
# [1] "LogACG ~ Rank_Code + Engineering"
# 
# [[7]]
# [1] "LogACG ~ Gender + Engineering"
# 
# [[8]]
# [1] "LogACG ~ Rank_Code + Gender + Engineering"

सूची तत्व में संपूर्ण मॉडल ऑब्जेक्ट प्राप्त करने के लिए, प्रतिस्थापित करें

glm.out[i] <- capture.output(tmp$formula)

साथ

glm.out    <- append(glm.out, tmp)

अर्थात।

for(i in 1:nrow(model.spec.matrix)){
  cn <- colnames(model.spec.matrix[sapply(model.spec.matrix[i,], function(x) x > 0)])
  if(length(cn) == 0){cn <- "."}  
  tmp        <- glm(as.formula(paste("LogACG~",paste(cn,collapse = "+"),sep = "")), family = gaussian, data = salary)
  tmp1       <- cv.glm(salary, tmp, K = 10)$delta[1]
  glm.out    <- append(glm.out, tmp)
  cv.err     <- append(cv.err, tmp1)
}

> tail(cv.err)
[[1]]
[1] 2.751025

[[2]]
[1] 2.758954

[[3]]
[1] 2.735063

[[4]]
[1] 2.768075

[[5]]
[1] 2.774433

[[6]]
[1] 2.748291

साथ ही, आपको bestglm जैसे पैकेज का उपयोग करने के लिए बेहतर सेवा दी जा सकती है या केवल step डिफ़ॉल्ट pacakge stats से फ़ंक्शन (देखें ?step)।

1
Hack-R 21 अप्रैल 2020, 01:26