我正試圖撰寫一個函式,該函式將運行多個回歸,然后將輸出存盤在一個向量中。我想讓該函式從我提供的串列中挑選因變數,然后在相同的右側變數上運行回歸。我不知道如何去做這件事。如果有任何提示,我們將不勝感激。
my_data <- data. frame(x1=(1。 10) rnorm(10, 3, 1. 5)。 x2=25/3 rnorm(10, 0, 1),
描繪。 var1=seq(5。 28, 2. 5), dep. var2=seq(100。 -20, -12。 5),
描繪。 var3=seq(1, 25, 2. 5))
##下面是一個告訴函式的串列。
dep.var <- list(dep.var1=my_data$dep. var1, dep.var2=my_data$dep.var2)
##從my_data中使用哪個因變數。
all_models <- function(dep. var){lm(dep. var ~ x1 x2。 data=my_data)}
模型<- sapply(dep. var, all_models) ##這里的 "sapply "告訴函式要
##從串列dep.var.中獲取因變數。
我希望 "模型 "串列中有兩個物件:model1與dep.var1,model2與dep.var2。然后根據需要,我將使用 summary(model#) 來查看回歸輸出。
我知道,當使用一個向量(即p)時,這在理論上是可行的:
p <- seq(/span>0. 25, 0.95, 0.05)
s < - function(p) {1 - pnorm(35。 p*1*44。 sqrt(44)*sqrt(p*(1 - p)))}
f <- sapply(p,s)
但是,我無法讓整個事情按照我的回歸模型的要求來運作。它在一定程度上起作用,因為你可以運行并檢查 "模型",它將向你顯示兩個回歸輸出 - 但它是可怕的。而且 "模型 "并不顯示回歸規范,即dep.var1 ~ x1 x2.
。uj5u.com熱心網友回復:
考慮reformulate來動態地改變模型公式,使用字符值進行lm呼叫:
# VECTOR OF COLUMN NAMES (NOT VALUES)/span>
dep.vars <- c("Dep. var1", "dep.var2")
# USER-DEFINED METHOD TO PROCESS DIFFERENT DEP VAR
run_model <- function(dep.var) {>
fml < -重新計算(c("x1"/span>。 "x2"), dep. var)
lm(fml, data=data)
}
# 命名的模型串列 # 命名的模型串列
all_models <- sapply(dep. vars, run_model, simplify = FALSE)
# OUTPUT RESULTS
all_models$dep.var1
all_models$dep.var2
...
從這里開始,你可以在模型物件中運行進一步的提取或處理:
# Named LIST OF MODEL SUMMARIES
all_summaries <- lapply(all_models, summary)
all_summaries$dep.var1
all_summaries$dep.var2
...
# NAMED LIST OF MODEL COEFFICIENTS < - lapply(all_models, `[`, "coefficients")
all_coefficients$dep.var1
all_coefficients$dep.var2
...
uj5u.com熱心網友回復:
你可以套用依賴變數的名稱,你可以用grep很好地識別。在lm中使用reformulate來建立公式。
sapply(grep('^dep'/span>。 names(my_data)。 value=TRUE)。 (x)
lm(reformulate(c('x1', 'x2')。 x), my_data))
# dep.var1 dep.var2 dep.var3
# coefficients numeric,3 numeric,3 numeric,3
# residuals numeric,10 numeric,10 numeric,10
# effects numeric,10 numeric,10 numeric,10
# rank 3 3 3
# fitted.values numeric,10 numeric,10 numeric,10
# assign integer,3 integer,3 integer,3
# qr qr,5 qr,5 qr,5
# df.residual 7 7 7
# xlevels list,0 list,0 list,0
# call expression expression
# terms dep.var1 ~ x1 x2 dep.var2 ~ x1 x2 dep.var3 ~ x1 x2
# model data.frame,3 data.frame,3 data.frame,3
dep.var*在結果中出現得很好。
然而,你可能想使用lapply并將其輸送到setNames()以獲得串列元素的命名。當然,你可以不使用grep,而是手動定義依賴變數。為了得到一個干凈的公式呼叫存盤,我們使用一個技巧,曾經@g-grothendieck教我的使用do.call。
dv <- as. list(grep('^dep'>, names(my_data)。 value=TRUE)[1。 2])
res < - lapply(dv。 (x) {
f < -重新計算(c('x1'。 'x2'), x)。
做。 call('lm', list(f。 quote(my_data))>
}) |>
setNames(dv)
回應
# $dep.var1
#
# Call:
# lm(formula = dep.var1 ~ x1 x2, data = my_data)
#
# Coefficients:
# (Intercept) x1 x2
# -4.7450 2.3398 0.2747
#
#
# $dep.var2
#
# Call:
# lm(formula = dep.var2 ~ x1 x2, data = my_data)
#
# Coefficients:
# (Intercept) x1 x2
# 148.725 -11.699 -1.373
這允許你獲得物件的summary(),這可能是你想要的。
summary(res$dep.var1)
# Call:
# lm(formula = dep.var1 ~ x1 x2, data = my_data)
#
# Residuals:
# Min 1Q Median 3Q Max
# -2.8830 -1.8345 -0.2326 1.4335 4.2452
#
# Coefficients:
# Estimate Std. Error t value Pr(>|t|)
# (Intercept) -4.7450 7.2884 -0.651 0.536
# x1 2.3398 0.2836 8.251 7.48e-05 ***
# x2 0.2747 0.7526 0.365 0.726
# ---
# Signif.代碼: 0 '***' 0.001 '**' 0.01 '*' 0.05 '. ' 0.1 ' 1
#
# 殘差標準誤差:2.55,7個自由度。
# Multiple R-squared: 0.9117,調整后的R平方。 0.8865
# F-statistic: 36.14 on 2 and 7 DF, p-value: 0.0002046
最后你可以用一個函式來包裝它
calc_models < - (dv)/span> {
lapply(dv。 (x) {
f < -重新計算(c('x1'。 'x2'), x)。
做。 call('lm', list(f。 quote(my_data))>
}) |>
setNames(dv)
}
calc_models(list('dep。 var1', 'dep.var2'))
uj5u.com熱心網友回復:
這里有一個方法,你可以遍歷你的資料框架,并將函式應用于你定義的組(這里dep.var),并在資料框架中保存不同的模型:
library(tidyverse)
library(broom)
my_data%>%
pivot_longer()
starts_with("dep"),
names_to = "group",
values_to = "dep.var"/span>
) %>%
mutate(group = as. factor(group) %>%
group_by(group) %>%
group_split() %>%
map_dfr(. f = function(df) {.
lm(dep. var ~ x1 x2, data = df) %> %
tidy() %>% # first output
#glance() %>% #第二次輸出
add_column(group = unique(df$group)。 . before=1) 。
})
dataframe輸出:
# A tibble: 9 x 6
組術語估計值 std.error 統計學 p.value
<fct> < chr> <dbl> <dbl> < dbl> <dbl>
1 dep.var1 (Intercept) -5。 29 11.6 -0.456 0.662
2 dep.var1 x1 2.11 0.268 7.87 0.000101
3 dep.var1 x2 0.538 1.23 0.437 0.675
4 dep.var2 (截距) 151. 57.9 2.61 0.0347[/span
5 dep.var2 x1 -10.6 1。 34 -7.87 0.000101[/span
6 dep.var2 x2 -2.69 6。 15 -0.437 0.675.
7 dep.var3 (Intercept) -9。 29 11.6 -0.802 0.449
8 dep.var3 x1 2.11 0.268 7.87 0.0001
9 dep.var3 x2 0.538 1.23 0.437 0.675
串列輸出:
[[1]]
# A tibble: 3 x 6
組術語估計值 std.error 統計學 p.value
<fct> < chr> <dbl> <dbl> < dbl> <dbl>
1 dep.var1 (Intercept) -5。 29 11.6 -0.456 0.662
2 dep.var1 x1 2.11 0.268 7.87 0.000101
3 dep.var1 x2 0.538 1.23 0.437 0.675
[[2]]
# A tibble: 3 x 6
組術語估計值 std.error 統計學 p.value
<fct> < chr> <dbl> <dbl> < dbl> <dbl>
1 dep.var2 (Intercept) 151. 57.9 2.61 0.0347[/span
2 dep.var2 x1 -10.6 1. 34 -7.87 0.000101[/span
3 dep.var2 x2 -2.69 6。 15 -0.437 0.675.
[[3]]
# A tibble: 3 x 6
組術語估計值 std.error 統計學 p.value
<fct> < chr> <dbl> <dbl> < dbl> <dbl>
1 dep.var3 (Intercept) -9。 29 11.6 -0.802 0.449
2 dep.var3 x1 2.11 0.268 7.87 0.0001
3 dep.var3 x2 0.538 1.23 0.437 0.675
glance output:
group r.squared adj.r.squared sigma statistic p.value df logLik AIC BIC deviance df.residual nobs
<fct> <dbl> <dbl> < dbl> <dbl> <dbl> < dbl> <dbl> <dbl>/span> <dbl> <dbl> < int> <int>/span>
1 dep.var1 0.927 0.906 2.32 44.3 0。 000106 2 -20.8 49. 7 50.9 37.8 7 10
2 dep.var2 0.927 0.906 11.6 44.3 0。 000106 2 -36.9 81. 9 83.1 944. 7 10
3 dep.var3 0.927 0.906 2.32 44.3 0。 000106 2 -20.8 49. 7 50.9 37.8 7 10
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/326646.html
標籤:
