簡體   English   中英

如何從regsubsets獲取LM對象

[英]How to obtain a LM object from regsubsets

假設我們要使用收入,年輕人,城市和地區作為回歸變量來對美國州公立學校支出(教育)進行建模。 有關更多信息: ?Anscombe模型:教育〜(收入+年輕人+城市)*地區

library(car)
library(leaps)

#Loading Data
data(Anscombe)
data(state)
stateinfo <- data.frame(region=state.region,row.names=state.abb)
datamodel <- data.frame(merge(stateinfo,Anscombe,by="row.names"),row.names=1)
head(datamodel)
   region education income young urban
AK   West       372   4146 439.7   484
AL  South       112   2337 362.2   584
AR  South       134   2322 351.9   500
AZ   West       207   3027 387.5   796
CA   West       273   3968 348.4   909
CO   West       192   3340 358.1   785

#Saturated Model
MOD1 <- lm(education~(.-region)*region,datamodel)
summary(MOD1)
#anova(MOD1)

#Look for the "best" model
MOD1.subset <- regsubsets(education~(.-region)*region,datamodel,nvmax=15)
plot(MOD1.subset) 

就BIC而言,具有3個變量和1個交互作用的模型(education〜income + young + urban + RegionWest:young)似乎是最好的。

coef(MOD1.subset,4)

問題是, 如何在不手動編寫公式的情況下從該模型獲得ML對象

發布之前,我發現了HH軟件包,它對regsubsets對象具有一些有趣的功能,例如summaryHHlm.regsubsets

library(HH)
summaryHH(MOD1.subset)[4,]
lm.regsubsets(MOD1.subset,4)

lm.regsubsets是我想要的,但是我認為解析交互存在一些問題,還有其他選擇嗎?

我認為這是不可能的,至少在沒有大量處理系數名稱的情況下。 我到達那里的方式達到了〜95%,但跌落了互動條件:

coefs <- coef(MOD1s, 4)
nams <- names(coefs)
nams <- nams[!nams %in% "(Intercept)"]
response <- as.character(as.formula(MOD1s$call[[2]])[[2]])
form <- as.formula(paste(response, paste(nams, collapse = " + "), sep = " ~ "))
df <- get(as.character(MOD1s$call[[3]]))
mod <- lm(form, data = df)

> mod <- lm(form, data = df)
Error in eval(expr, envir, enclos) : object 'regionWest' not found

這是有道理的,並且源於系數的名稱:

> nams
[1] "income"           "young"            "urban"           
[4] "regionWest:young"

通過一些努力,您很可能可以做到:

  1. :分割所有名稱:
  2. 對於每一側,請查看是否與數據框df的變量部分匹配
  3. 如果有匹配項,則在需要時強制為一個因數,然后檢查不匹配的位是否與df變量的級別匹配,
  4. 如果與某個級別匹配,則將交互的那一側替換為變量名稱,
  5. 如果不匹配,則查看是否有其他部分匹配,如果不匹配,則失敗

等等。 [so]發布涉及很多編程,但是如果您要應對挑戰,那么以上內容應該為您提供一些起點。

很抱歉再次提出這個問題,但我自己正在尋找答案。

使用的特定標准(例如AIC,BIC)不會影響regsubsets的結果,因為該功能僅與相同大​​小的模型進行比較,並且AIC與BIC的區別僅在於分配給模型大小的“懲罰”。 但是,如果您有興趣比較不同大小的模型,則可能更喜歡使用AIC而不是BIC。

我不認為regsubsets具有繪制AIC的功能。 但是,可以使用以下方法輕松計算AIC:

aic <-summary(leaps2)$bic + (2 - log(n))*(p+1)

其中n是樣本數,p是模型中參數的數目(有關aic和bic的定義,請參見http://stat.wharton.upenn.edu/~khyuns/stat431/ModelSelection.pdf的最后一頁) )。

我試圖欺騙regsubsets以繪制新的aic值,但未成功。 但是,您只需查看aic值矩陣,然后使用“ order(aic)”對它們進行排序即可輕松比較不同大小的模型

我想到了。 所以這是代碼。

fit <- regsubsets(y~x,data=train)
b <- data[c(predictor columns)]
best <- order(summary(fit)$adjr2,decreasing=T)[1]
a <- as.integer(summary(fit)$which[best,][1:ncol(b)+1]
new_data <- data.frame(t( t(b) * a))
fit_lm <- lm(y~x,data=new_data)

您將這些列乘以布爾值。 如果輸入始終為0,則不會對模型執行任何操作。 沒有解釋差異。 如果需要,可以通過for循環中的“最佳”變量中的最后一個索引替換為“ i”,從而遍歷此過程。

警告:您的列必須對齊以獲取火車/跨站/測試數據。 如果訓練集的第一個索引是“性別”,而交叉驗證集的第一個索引是“年齡”,那么您將把錯誤的列清零。

旁注:您可以看到,我針對調整后的R ^ 2值選擇了最佳模型。 隨時更改。

希望我能幫上忙。 干杯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM