【问题标题】:Several regressions between a comon x and different yi for each level of a categorical variable分类变量的每个级别的常见 x 和不同 ui 之间的若干回归
【发布时间】:2017-04-15 17:23:43
【问题描述】:

我如何修改下面的代码,或提出更好的解决方案,分别为每个级别的 B 计算 x 和每个 yi i=1 到 n(假设 n 等于 3)之间的回归线,并将所有结果(截距,系数,R值)到一个新的data.frame。我的意思是一个数据集,第一列是指 B 的水平,另一列是系数的值,r.square 为每个xyi

vars <- names(a[,grepl("y",names(a))])
fits <- lapply(vars, function(x) {lm(substitute(i ~ x, list(i = as.name(x))), data = a)})
summary <-lapply(fits,summary)

subject<-seq(1,20,1)
x<-seq(10,29,1)
B<-rep(1:2,10)
y1<-seq(15,34,1)
y2<-seq(20,39,1)
y3<-seq(50,69,1)
a<-data.frame(subject,x,B,y1,y2,y3)

【问题讨论】:

    标签: r


    【解决方案1】:
    library(purrr)
    library(dplyr)
    library(broom)
    
    a %>% gather(key = variable, value = value, -subject, -x, -B) %>%
      filter(B == as.numeric(gsub("y", "", variable))) %>% 
      group_by(B, variable) %>% 
      nest() %>%
      mutate(models = data %>% map(., ~lm(value~x, data = .))
             ,results = models %>% map(., tidy)
             ,r.squared = models %>% map(., ~glance(.) %>% select(r.squared))) %>% 
      unnest(r.squared) %>% 
      unnest(results)
    

    结果

    # A tibble: 4 × 8
          B variable r.squared        term estimate    std.error    statistic       p.value
      <int>    <chr>     <dbl>       <chr>    <dbl>        <dbl>        <dbl>         <dbl>
    1     1       y1         1 (Intercept)        5 3.520120e-15 1.420406e+15 6.759543e-119
    2     1       y1         1           x        1 1.773411e-16 5.638852e+15 1.095702e-123
    3     2       y2         1 (Intercept)       10 6.950480e-15 1.438749e+15 6.100095e-119
    4     2       y2         1           x        1 3.340188e-16 2.993844e+15 1.735342e-121
    

    【讨论】:

    • 感谢您的帮助。请问为什么你的代码的结果和mtoto的结果不同(下面的解决方案)?
    • 我对这个问题做了不同的解释。它声明了...对于每个级别的 B,分别在 x 和 yi=1 到 n(假设 n 等于 3)之间的回归线
    • 感谢您的帮助。就两个问题。 1-我如何才能获得每个回归的 r 平方值。 2-(如果您认为回答太多,我可以提出一个新问题)如何修改您的代码以在具有相同索引的 B 级别的 x 和 yi 之间进行回归,我的意思是 lm(y1~x when B==1), lm(y2~x 当 B==2)。当 B 和变量具有相同的索引时,我需要制作结果的子集,例如,B=1 和 y1,B=2 和 y2(我需要一个循环函数,因为在我的真实数据集中我有 B 和 y 的 n 值)
    • 1.我添加了一个步骤来获取 r-squared。 2. 我添加了一个步骤,仅根据您的评论中的愿望保留 B 等于 y 的索引的情况。此设置应推广到具有 n 个 y 变量的设置。
    【解决方案2】:

    最好先使用gather() 整理数据,这样所有以"y" 开头的列都在一个变量中。因此,我们使用后者作为key 嵌套您的数据,并使用purrr 包中的map() 对每个组应用lm 拟合。最后我们使用来自broom 包的tidy() 来清理输出并将其作为data.frame 返回:

    library(tidyr)
    library(purrr)
    library(broom)
    
    a %>% gather(key,value,-subject,-x,-B) %>%
            nest(-key) %>% 
            mutate(model = map(data, ~lm(value ~ x, data = .)),
                   tidied = map(model, tidy)) %>%
            unnest(tidied)
    #    key        term estimate    std.error    statistic       p.value
    #  <chr>       <chr>    <dbl>        <dbl>        <dbl>         <dbl>
    #1    y1 (Intercept)        5 2.838021e-15 1.761791e+15 1.375776e-264
    #2    y1           x        1 1.395654e-16 7.165099e+15 1.485006e-275
    #3    y2 (Intercept)       10 2.838021e-15 3.523582e+15 5.248168e-270
    #4    y2           x        1 1.395654e-16 7.165099e+15 1.485006e-275
    #5    y3 (Intercept)       40 2.063483e-16 1.938470e+17 2.462998e-301
    #6    y3           x        1 1.014760e-17 9.854551e+16 4.789215e-296
    

    【讨论】:

    • 感谢您的帮助。我可以知道为什么您的代码结果与 JohanSjoberg 的解决方案不同。
    • 因为他同时按Bvariable 进行分组,如果您添加nest(-key,-B),您会得到相同的结果,但是并不完全清楚哪一个是您的预期输出。
    猜你喜欢
    • 2015-11-26
    • 2023-03-09
    • 2019-11-20
    • 2012-07-22
    • 2015-06-04
    • 2014-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多