计算个人的回归系数(低样本量回归)?

数据挖掘 r 回归 聚类
2022-02-20 10:10:53

有没有办法计算个人的回归系数,而不仅仅是一个群体。计算非常小的样本量的回归系数?

背景

我的目标是测试对一群人进行聚类/细分的不同方法。在所讨论的领域中,用于分割的最佳变量将是最能表达个人对某些属性的重要性的变量。

但是,我没有直接衡量这种重要性。我所拥有的是基于属性评级和最终受访者选择的 shapley 值回归对整个样本进行的间接测量。

明确地说,我问了几个人他们如何评价给定品牌的属性以及他们最终会选择哪个品牌。

现在我想知道是否有可能在个人层面也获得这种间接重要性测量,这意味着:

  • 从整体回归模型中提取单个系数估计量(我认为这是不可能的)
  • 计算每个人的回归(不知道如何做到这一点,因此问题)

问题和我尝试过的

我工作,R我知道如何拟合分组线性模型。由于我所有的受访者都对两个品牌进行了评分,因此我确实每组有 n = 2。

然而,拟合正常的分组线性模型会导致不可用的结果,其中几乎所有系数都是 NA 并且一或二等于 1。此外,我更愿意拟合相对重要性或 shapley 值回归,但relaimpo包会抛出一个错误,抱怨观察太少。

我还能追求哪些其他途径?

更新:

到目前为止,我一直在使用此代码:

df %>% 
  group_by(i_TAN) %>%
  do(model = lm(formula = Consideration ~ ., data = .))
2个回答

@Ben Norris 发现这些relaimpo包的观察次数很少,所以如果我想走这条路,我必须增加我的样本量。

因为我只有我拥有的数据,所以我追求了一个“hacky”解决方案,为了完成主义者的缘故,我将对其进行描述。步骤如下:

  1. 将每个人k随机分配到一组中,以便n/k > 4(n 是总样本量)

  2. 重复此步骤i几次,以便将每个人分配到i

  3. 将总数据集拆分为 k沿组的 dfs列表

  4. relaimpo为每个数据集训练回归模型

  5. 对个人所属的所有组的结果系数进行平均,以获得近似的“个人系数”

这是一个相当不科学的过程,但对我来说似乎比简单地“复制”个人答案直到满足最小样本量更好。

这是我使用的代码:

library(dplyr)
library(magrittr)
library(relaimpo)

#create groups
df %>%
  add_count(i_TAN) %>%
group_by(i_TAN) %>%
  mutate(
    g1 = as.integer(runif(n, 1, 51)),
    g2 = as.integer(runif(n, 1, 51)),
    g3 = as.integer(runif(n, 1, 51)),
    g4 = as.integer(runif(n, 1, 51))
  ) %>%
  {.} -> df

# Create all dfs
df %>%
  select(i_TAN,g1,g2,g3,g4) %>%
  gather(nam,group,-i_TAN) %>%
  distinct() %>%
  select(-nam) %>%
  left_join(df, by = "i_TAN") %>%
  select(1:35) %$%
  split(.,group) %>%
  {.} -> list_of_df

lapply(list_of_df, function(x) { x["group"] <- NULL; x }) %>%
  lapply(function(x) { x["i_TAN"] <- NULL; x }) %>%
  {.} -> list_of_modelDF

# Fit all models
lapply(list_of_modelDF,function(x){lm(Consideration~.,data = x)}) -> list_of_reg

lapply(list_of_reg,function(x){relaimpo::calc.relimp(object = x, type = c("lmg"), rela = TRUE)}) -> list_of_relaimpo
```

tidyr你可以用、dplyr来做你想做的事情purrrbroom关键的工作流程顺序是

1. group your data with `dplyr::group_by`
2. use `tidyr::nest` to generate a list column of data.frames
3. use `dplyr::mutate` and `purrr::map` to generate a list column containing the models
4. use `broom::tidy` to convert the model into a data.frame
5. use `tidyr::unnest` to convert the model parameters back into readable data. 



library(dplyr)
library(tidyr)
library(purrr)
library(broom)
# Setting up a simple example data.frame
df <- data.frame(ID = c(1, 1, 1, 2, 2, 2),
                 X = runif(6),
                 Y = rnorm(6))
df %>%
  group_by(ID) %>%
  nest() %>%
  mutate(model = map(data, function(df) lm(X ~ Y, data = df))) %>%
  mutate(tidy = map(model, tidy)) %>%
  unnest(cols = c(tidy))
# A tibble: 4 x 8
# Groups:   ID [2]
     ID data             model  term        estimate std.error statistic p.value
  <dbl> <list>           <list> <chr>          <dbl>     <dbl>     <dbl>   <dbl>
1     1 <tibble [3 x 2]> <lm>   (Intercept)    0.453    0.0153    29.5    0.0215
2     1 <tibble [3 x 2]> <lm>   Y             -0.227    0.0128   -17.7    0.0360
3     2 <tibble [3 x 2]> <lm>   (Intercept)   -0.221    0.281     -0.787  0.576 
4     2 <tibble [3 x 2]> <lm>   Y              0.366    0.207      1.76   0.328