当前位置: 首页 > 知识库问答 >
问题:

使用每个预测器列拟合具有多个响应的模型将结果单独存储在数据框中

祁渊
2023-03-14

参考了Fit模型,该模型使用每个预测器列单独地将结果存储在dataframe中,其中一个dataframe由一列响应变量和几列预测器变量组成。作者希望分别使用每个预测变量来拟合响应变量的模型,最后创建一个包含模型系数的数据框。在我感兴趣的原始问题下面有一个答案https://stackoverflow.com/a/43959567/14435732(复制如下)。

require(tibble)
require(dplyr)
require(tidyr)
require(purrr)
require(broom)

df <- iris
response_var <- "Sepal.Length"

vars <- tibble(response=response_var,
               predictor=setdiff(names(df), response_var))

compose_formula <- function(x, y)
  as.formula(paste0("~lm(", y, "~", x, ", data=.)"))

models <- tibble(data=list(df)) %>%
           crossing(vars) %>%
           mutate(fmla = map2(predictor, response, compose_formula),
                  model = map2(data, fmla, ~at_depth(.x, 0, .y)))

models %>% unnest(map(model, tidy))

    null

有没有一种方法可以像下面这样得到一个理想的输出?(复制自https://stackoverflow.com/A/43959567/14435732)

# A tibble: 9 x 7
      response    predictor              term   estimate  std.error statistic
         <chr>        <chr>             <chr>      <dbl>      <dbl>     <dbl>
1 Sepal.Length  Sepal.Width       (Intercept)  6.5262226 0.47889634 13.627631
2 Sepal.Length  Sepal.Width       Sepal.Width -0.2233611 0.15508093 -1.440287
3 Sepal.Length Petal.Length       (Intercept)  4.3066034 0.07838896 54.938900
4 Sepal.Length Petal.Length      Petal.Length  0.4089223 0.01889134 21.646019
5 Sepal.Length  Petal.Width       (Intercept)  4.7776294 0.07293476 65.505517
6 Sepal.Length  Petal.Width       Petal.Width  0.8885803 0.05137355 17.296454
7 Sepal.Length      Species       (Intercept)  5.0060000 0.07280222 68.761639
8 Sepal.Length      Species Speciesversicolor  0.9300000 0.10295789  9.032819
9 Sepal.Length      Species  Speciesvirginica  1.5820000 0.10295789 15.365506
# ... with 1 more variables: p.value <dbl>

共有1个答案

顾鸣
2023-03-14

您可以使用多响应线性模型,其中每个响应都针对每个预测器分别进行回归,例如:

lm(cbind(Sepal.Length,Sepal.Width) ~ Species,data=iris)

Call:
lm(formula = cbind(Sepal.Length, Sepal.Width) ~ Species, data = iris)

Coefficients:
                   Sepal.Length  Sepal.Width
(Intercept)         5.006         3.428     
Speciesversicolor   0.930        -0.658     
Speciesvirginica    1.582        -0.454 

你会得到两组预测器,tidy在这方面做得很好:

tidy(lm(cbind(Sepal.Length,Sepal.Width) ~ Species,data=iris))
# A tibble: 6 x 6
  response     term              estimate std.error statistic   p.value
  <chr>        <chr>                <dbl>     <dbl>     <dbl>     <dbl>
1 Sepal.Length (Intercept)          5.01     0.0728     68.8  1.13e-113
2 Sepal.Length Speciesversicolor    0.93     0.103       9.03 8.77e- 16
3 Sepal.Length Speciesvirginica     1.58     0.103      15.4  2.21e- 32
4 Sepal.Width  (Intercept)          3.43     0.0480     71.4  5.71e-116
5 Sepal.Width  Speciesversicolor   -0.658    0.0679     -9.69 1.83e- 17
6 Sepal.Width  Speciesvirginica    -0.454    0.0679     -6.68 4.54e- 10  

现在我们只需要重复上面的操作,改变RHS上的公式,所以我们可以使用Repemature来做到这一点,例如:

reformulate(termlabels="Species",response="cbind(Sepal.Length,Sepal.Width)")

cbind(Sepal.Length, Sepal.Width) ~ Species
library(purrr)
library(dplyr)

tidyMLM = function(iv,dat){

    f = reformulate(termlabels=iv,
    response="cbind(Sepal.Length,Sepal.Width)")
    
    tidy(lm(f,data=dat)) %>% mutate(predictor=iv,.after=response)
}
predictors = setdiff(colnames(iris),c("Sepal.Length","Sepal.Width"))

map_dfr(predictors,tidyMLM,dat=iris)
# A tibble: 14 x 7
   response    predictor    term          estimate std.error statistic   p.value
   <chr>       <chr>        <chr>            <dbl>     <dbl>     <dbl>     <dbl>
 1 Sepal.Leng… Petal.Length (Intercept)      4.31     0.0784     54.9  2.43e-100
 2 Sepal.Leng… Petal.Length Petal.Length     0.409    0.0189     21.6  1.04e- 47
 3 Sepal.Width Petal.Length (Intercept)      3.45     0.0761     45.4  9.02e- 89
 4 Sepal.Width Petal.Length Petal.Length    -0.106    0.0183     -5.77 4.51e-  8
 5 Sepal.Leng… Petal.Width  (Intercept)      4.78     0.0729     65.5  3.34e-111
 6 Sepal.Leng… Petal.Width  Petal.Width      0.889    0.0514     17.3  2.33e- 37
 7 Sepal.Width Petal.Width  (Intercept)      3.31     0.0621     53.3  1.84e- 98
 8 Sepal.Width Petal.Width  Petal.Width     -0.209    0.0437     -4.79 4.07e-  6
 9 Sepal.Leng… Species      (Intercept)      5.01     0.0728     68.8  1.13e-113
10 Sepal.Leng… Species      Speciesversi…    0.93     0.103       9.03 8.77e- 16
11 Sepal.Leng… Species      Speciesvirgi…    1.58     0.103      15.4  2.21e- 32
12 Sepal.Width Species      (Intercept)      3.43     0.0480     71.4  5.71e-116
13 Sepal.Width Species      Speciesversi…   -0.658    0.0679     -9.69 1.83e- 17
14 Sepal.Width Species      Speciesvirgi…   -0.454    0.0679     -6.68 4.54e- 10

如果你有80个反应,120个预测:

df = data.frame(matrix(rnorm(100*200),ncol=200))
colnames(df) = c(paste0("r",1:80),paste0("p",1:120))
responses = as.matrix(df[,grep("r",colnames(df))])
predictors = grep("p",colnames(df),value=TRUE)

tidyMLM = function(iv,dat){
    
        f = reformulate(termlabels=iv,
        response="responses")
        
        tidy(lm(f,data=dat)) %>% mutate(predictor=iv,.after=response)
    }

map_dfr(predictors,tidyMLM,dat=df)

# A tibble: 19,200 x 7
   response predictor term        estimate std.error statistic p.value
   <chr>    <chr>     <chr>          <dbl>     <dbl>     <dbl>   <dbl>
 1 r1       p1        (Intercept)  -0.0959    0.0882    -1.09   0.280 
 2 r1       p1        p1            0.0217    0.0879     0.247  0.806 
 3 r2       p1        (Intercept)  -0.0174    0.101     -0.172  0.864 
 4 r2       p1        p1           -0.186     0.101     -1.84   0.0685
 5 r3       p1        (Intercept)   0.0214    0.0947     0.226  0.822 
 6 r3       p1        p1            0.0651    0.0944     0.690  0.492 
 7 r4       p1        (Intercept)   0.0708    0.103      0.686  0.495 
 8 r4       p1        p1           -0.142     0.103     -1.38   0.169 
 9 r5       p1        (Intercept)   0.134     0.101      1.33   0.186 
10 r5       p1        p1            0.0248    0.100      0.247  0.805 
# … with 19,190 more rows

我希望现在这说得通了。

 类似资料:
  • 我想知道是否有可能将不同流中的数据合并成一个流。通过合并,我的意思是将其添加到单独的列中,而不是添加到现有的列中。 到目前为止,我已经能够将数据收集到单独的地图中,如下面的示例所示。我认为我应该把这些地图合并成一张,但不确定如何去做,或者我是否做错了什么。 我做了一些搜索,在FlatMap、Concat等网站上找到了一些线索,但因为我对这条流还不熟悉 例如:列出数据-1

  • 问题内容: 我正在尝试整理我的第一个数据驱动测试框架,该框架通过Selenium Grid / WebDriver在多个浏览器上运行测试。现在,我在自己的类中拥有每个测试用例,并且对浏览器进行了参数设置,因此它在每个浏览器中都运行一次每个测试用例。 在大型测试框架上常见吗?还是应该将每个测试用例复制并微调到其各自类中的每个浏览器?因此,如果我正在测试chrome,firefox和IE,是否应该为每

  • 问题内容: 在此先感谢您的帮助。 好吧,这就是我的情况。我有一个Web系统,该系统基于超声波计创建的样本进行一些与噪声相关的计算。最初,数据库仅存储这些计算的结果。但是现在,我被要求也自己存储样本。每个样本只是一个300或600个数字的列表,每个数字都有一个小数。 因此,我想到的最简单的方法是在表中添加一列,该列存储给定样本的所有计算。此列应包含数字列表。 那么我的问题是:将这一数字列表存储在单列

  • 我有一个禁用聚合图监听器的脚本。我在非GUI模式下运行测试。 bat-t test.jmx-l result.jtl 运行脚本后,我在聚合图形侦听器中打开结果文件,并能够查看图形。现在我需要在脚本中添加更多的图形侦听器。如何在非GUI模式下为侦听器获得单独的结果文件(为了优化脚本,所有侦听器都被禁用)。 我可以在聚合图侦听器中打开结果文件。但是当我在响应时间图中打开相同的文件时,我得到的消息是-

  • 问题内容: 我正在使用pyspark,使用spark- csv将大的csv文件加载到数据帧中,并且作为预处理步骤,我需要对其中一列(包含json字符串)中的可用数据进行多种操作。这将返回X值,每个值都需要存储在自己的单独列中。 该功能将在UDF中实现。但是,我不确定如何从该UDF返回值列表并将其馈送到各个列中。下面是一个简单的示例: 产生以下内容: 将udf返回的两个(在此示例中)值存储在单独的列

  • 问题内容: 我需要使用具有多个索引的大型数据框,因此我尝试创建一个数据框以了解如何将其存储在hdf5文件中。数据框是这样的:(在前2列中有multi索引) 我正在使用pandas.to_hdf,但在尝试选择组中的数据时会创建“固定格式存储”: 它返回一些错误,主要问题是 然后我试图像这样追加DataFrame: 那应该创建一个表,但这给了我另一个错误: 所以我需要的代码将数据帧存储在一个表中HDF