如何在给定的变量名列表上 运行 一组函数并将输出写入 table?
How to run a set of functions over given list of variable names and write the output to a table?
我想要做的是 运行 mean/standard 偏差计算,以及一组变量的统计测试。似乎正确的做法是构建函数,以便可以通过函数传递列名列表。
一个可能复杂的因素是对于这个特定的数据框,它需要与调查数据相关的某些功能。
library(radiant.data) #for weighted.sd
library(survey) #survey functions
library(srvyr) #survey functions
#building a df
df <- data.frame("GroupingFactor" = c(1, 1, 0, 0),
"VarofInterest1" = c(1, 1, 1, 0),
"VarofInterest2" = c(1, 0, 0, 0),
"PSU" = c(1, 2, 1, 2),
"SAMPWEIGHT" = c(0, 23254, 343, 5652),
"STRATA" = c(6133, 6131, 6145, 6152))
options(survey.adjust.domain.lonely=TRUE) #adjusting for the one PSU
options(survey.lonely.psu="adjust")
svy <- svydesign(~PSU, weights = ~SAMPWEIGHT, strata = ~STRATA, data = df, nest = TRUE, check.strata = FALSE) #the design
#here is what i would like to iterate
df %>%
group_by(GroupingFactor) %>%
summarise(mean = weighted.mean(VarofInterest1, SAMPWEIGHT, na.rm =T), sd = weighted.sd(VarofInterest1, SAMPWEIGHT, na.rm =T)) #for mean and SD
svychisq(~GroupingFactor+VarofInterest1, svy, statistic = 'Chisq') #the test of interest
创建 svy 对象后的所有内容都是我理想情况下在变量列表中自动化的内容,例如,应用于包括 VarofInterest2、VarofInterest3 等的列表。
最终产品是 table/tibble,包括所有变量名称、每个变量的均值和标准差以及卡方检验的输出(例如,检验 statistic/X-squared 和 p 值) .
我也会参考在非调查加权数据上执行此操作! (即,只是 运行 宁,比方说,十几个 t 检验使用类似的前提,即提供您想要的变量列表 运行 使用分组因子进行 t 检验)。
编辑:预期输出
GroupingFactor
Mean
SD
Statistic
p
Variable
0
.25
.25
341.14
.014
VarofInterest1
1
.50
.00
N/A
N/A
VarofInterest1
OR 单独的 functions/table 生成函数,其中一个只是 means/SDs:
GroupingFactor
Mean
SD
Variable
0
.50
.25
VarofInterest1
1
.25
.00
VarofInterest1
然后是测试统计数据和 p 值:
Variable
Statistic
p
VarofInterest1
4131.11
.001
VarofInterest2
131.14
.131
您可以编写一个函数 f()
来获取数据、组变量和感兴趣的变量,以及 return 统计数据。您需要修改以下示例以进行调查数据,但这可能会给你一个起点。
f <- function(df, g, v) {
v_string = quo_name(enquo(v))
g_string = quo_name(enquo(v))
chi_result = chisq.test(df[[v_string]], df[[g_string]])
df %>%
group_by({{g}}) %>%
summarize(Mean = mean({{v}}, na.rm=T),SD = sd({{v}}, na.rm=T)) %>%
mutate(variable=v_string,
statistic=chi_result$statistic,
pvalue=chi_result$p.value)
}
bind_rows(
lapply(c("VarofInterest1", "VarofInterest2"),\(i) f(df,GroupingFactor,!!sym(i)))
)
输出:
# A tibble: 4 × 6
GroupingFactor Mean SD variable statistic pvalue
<dbl> <dbl> <dbl> <chr> <dbl> <dbl>
1 0 0.5 0.707 VarofInterest1 0.444 0.505
2 1 1 0 VarofInterest1 0.444 0.505
3 0 0 0 VarofInterest2 0.444 0.505
4 1 0.5 0.707 VarofInterest2 0.444 0.505
我想要做的是 运行 mean/standard 偏差计算,以及一组变量的统计测试。似乎正确的做法是构建函数,以便可以通过函数传递列名列表。
一个可能复杂的因素是对于这个特定的数据框,它需要与调查数据相关的某些功能。
library(radiant.data) #for weighted.sd
library(survey) #survey functions
library(srvyr) #survey functions
#building a df
df <- data.frame("GroupingFactor" = c(1, 1, 0, 0),
"VarofInterest1" = c(1, 1, 1, 0),
"VarofInterest2" = c(1, 0, 0, 0),
"PSU" = c(1, 2, 1, 2),
"SAMPWEIGHT" = c(0, 23254, 343, 5652),
"STRATA" = c(6133, 6131, 6145, 6152))
options(survey.adjust.domain.lonely=TRUE) #adjusting for the one PSU
options(survey.lonely.psu="adjust")
svy <- svydesign(~PSU, weights = ~SAMPWEIGHT, strata = ~STRATA, data = df, nest = TRUE, check.strata = FALSE) #the design
#here is what i would like to iterate
df %>%
group_by(GroupingFactor) %>%
summarise(mean = weighted.mean(VarofInterest1, SAMPWEIGHT, na.rm =T), sd = weighted.sd(VarofInterest1, SAMPWEIGHT, na.rm =T)) #for mean and SD
svychisq(~GroupingFactor+VarofInterest1, svy, statistic = 'Chisq') #the test of interest
创建 svy 对象后的所有内容都是我理想情况下在变量列表中自动化的内容,例如,应用于包括 VarofInterest2、VarofInterest3 等的列表。
最终产品是 table/tibble,包括所有变量名称、每个变量的均值和标准差以及卡方检验的输出(例如,检验 statistic/X-squared 和 p 值) .
我也会参考在非调查加权数据上执行此操作! (即,只是 运行 宁,比方说,十几个 t 检验使用类似的前提,即提供您想要的变量列表 运行 使用分组因子进行 t 检验)。
编辑:预期输出
GroupingFactor | Mean | SD | Statistic | p | Variable |
---|---|---|---|---|---|
0 | .25 | .25 | 341.14 | .014 | VarofInterest1 |
1 | .50 | .00 | N/A | N/A | VarofInterest1 |
OR 单独的 functions/table 生成函数,其中一个只是 means/SDs:
GroupingFactor | Mean | SD | Variable |
---|---|---|---|
0 | .50 | .25 | VarofInterest1 |
1 | .25 | .00 | VarofInterest1 |
然后是测试统计数据和 p 值:
Variable | Statistic | p |
---|---|---|
VarofInterest1 | 4131.11 | .001 |
VarofInterest2 | 131.14 | .131 |
您可以编写一个函数 f()
来获取数据、组变量和感兴趣的变量,以及 return 统计数据。您需要修改以下示例以进行调查数据,但这可能会给你一个起点。
f <- function(df, g, v) {
v_string = quo_name(enquo(v))
g_string = quo_name(enquo(v))
chi_result = chisq.test(df[[v_string]], df[[g_string]])
df %>%
group_by({{g}}) %>%
summarize(Mean = mean({{v}}, na.rm=T),SD = sd({{v}}, na.rm=T)) %>%
mutate(variable=v_string,
statistic=chi_result$statistic,
pvalue=chi_result$p.value)
}
bind_rows(
lapply(c("VarofInterest1", "VarofInterest2"),\(i) f(df,GroupingFactor,!!sym(i)))
)
输出:
# A tibble: 4 × 6
GroupingFactor Mean SD variable statistic pvalue
<dbl> <dbl> <dbl> <chr> <dbl> <dbl>
1 0 0.5 0.707 VarofInterest1 0.444 0.505
2 1 1 0 VarofInterest1 0.444 0.505
3 0 0 0 VarofInterest2 0.444 0.505
4 1 0.5 0.707 VarofInterest2 0.444 0.505