为了账号安全,请及时绑定邮箱和手机立即绑定

使用 pandas 数据集按功能分组。Cronbach 的 alpha 与 Python 中的分组数

使用 pandas 数据集按功能分组。Cronbach 的 alpha 与 Python 中的分组数

蝴蝶不菲 2023-06-13 14:49:35
假设我有一个sim_data包含 16 个变量的数据集 ( ),其中包括心理数据(问卷中的 15 个项目),第一列是分类变量(国家/地区)。我可以使用以下方法轻松按组获取方法/标准差:sim_data.groupby("country").describe()但是,我想将来自特定包的函数(Cronbach 的 alpha)(pip install pingouin和( )与此数据一起应用,并按组import pingouin as pg获取结果(就像我之前所做的那样)。以下代码不起作用。pg.cronbach_alpha(sim_data.groupby("country"))这一个都不是sim_data.groupby('country').apply(lambda grp: pg.cronbach_alpha())重要笔记:如果你想重现,那是我的例程和数据集我是一个重度 R 用户,我正在将以下代码翻译成 pythonsim_data %>%  select('step_bfi1_ab_cor':'step_bfi39_ab_cor', "country") %>%  nest(-country) %>%  mutate(result=map(data, ~psych::alpha(.)$total)) %>%  select(country,result) %>%  unnest()欢迎提出建议。如果有另一种方法(更优雅)来解决我的问题,请告诉我。谢谢
查看完整描述

2 回答

?
慕婉清6462132

TA贡献1804条经验 获得超2个赞

通常,base R(不是 tidy R)更容易转换为 Python Pandas。您的 R 代码似乎在做的是按国家/地区列对数据框进行子集化,并将每个子集运行到psych::alpha(). 然后将提取的统计数据返回到带有国家指标的数据框中。

您可以对基数 R 执行完全相同的操作,它可以在列表理解中by转换为 Pandas 。groupby看起来psych::alpha返回的统计数据比pingouin.cronbach_alpha. 根据需要在未经测试的代码中调整字段和返回值。

基础 R (使用文档

# DEFINE METHOD

run_cronbach_alpha <- function(sub) {

    results <- psych::alpha(sub)$total    # RETURNS LIST

                      

    data.frame(country = sub$country[1],

               raw_alpha = results$raw_alpha,

               std.alpha = results$std.alpha,

               G6 = results$G6,

               average_r = results$average_r,

               median_r = results$median,

               mean = results$mean,

               sd = results$sd)

 }



# FILTER COLUMNS IN DATA FRAME

sim_short <- sim_data[c("step_bfi1_ab_cor", ..., "step_bfi39_ab_cor", "country")] 


# RUN METHOD BY COUNTRY SUBSETS TO RETURN DF LIST

results_df_list <- by(sim_short, sim_short$country, run_cronbach_alpha)


# ROW BIND ALL DFs TO SINGLE FINAL DATA FRAME

results_df <- do.call(rbind.data.frame, results_df_list)

Python Pandas (使用文档


# DEFINE METHOD

def run_cronbach_alpha(c, sub):

    results = pg.cronbach_alpha(sub.drop(["country"], axis="columns"))    # RETURNS TUPLE


    return pd.DataFrame({'country': c, 'cronbach_alpha': results[0], index=[0]})



# FILTER COLUMNS IN DATA FRAME

sim_short = sim_data.reindex(["step_bfi1_ab_cor", ..., "step_bfi39_ab_cor", "country"], 

                             axis='columns')

                         

# RUN METHOD BY COUNTRY SUBSETS TO RETURN DF LIST

results_df_list = [run_cronbach_alpha(i, df) for i,df in sim_short.groupby("country")]


# CONCATENATE ALL DFs TO SINGLE FINAL DATA FRAME

results_df = pd.concat(results_df_list)


查看完整回答
反对 回复 2023-06-13
?
慕村9548890

TA贡献1884条经验 获得超4个赞

def run_cronbach_alpha(c, sub):

    results = pg.cronbach_alpha(sub.drop(["country"], axis="columns"))    # RETURNS TUPLE

    return pd.DataFrame({'country': c, 'cronbach_alpha': results[0]}, index = ["Result"])

                       

# RUN METHOD BY COUNTRY SUBSETS TO RETURN DF LIST

results_df_list = [run_cronbach_alpha(i, df) for i,df in sim_data.groupby("country")]

results_df_list


查看完整回答
反对 回复 2023-06-13
  • 2 回答
  • 0 关注
  • 176 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信