Closed. This question needs debugging details。它当前不接受答案。












想改善这个问题吗?更新问题,以便将其作为on-topic用于堆栈溢出。

2年前关闭。



Improve this question




我有一个包含3,000多个行和10多个变量的表。我正在尝试使用一个变量作为预测变量,将另一个变量作为对300个不同组的响应进行线性回归。对于每个回归,我都需要斜率,p值和r平方。单独进行每个回归并记录摘要变量将花费数小时甚至数天。

我已经使用以下程序包获取每个组的截距和斜率,但是我不知道如何为每个组也获取相应的p值和r平方:
library(lme4)
groupreg<-lmList(logpop ~ avgp | id, data=data)
groupreg

我在下面实现了一个列表示例,其中“Adams#”是id值。之所以存在NA,是因为并非所有组都有多个要绘制和比较的点:
Coefficients:
                (Intercept)          avgp
Adams 6           4.0073332            NA
Adams 7           6.5177389 -7.342443e+00
Adams 8           4.7449321            NA
Adams 9                  NA            NA

但是,此表不包括任何重要度统计信息。我仍然需要p值和r平方统计量。如果有一个代码可以一次完成所有组值,或者有一个代码仅提取其余值,那将很有帮助。

有没有办法对所有组的斜率输出求幂?我的结果被对数转换。

谢谢你们!!

最佳答案

我认为最简单的答案仍然缺失。您可以结合使用嵌套和映射。我将向您展示它如何用于线性回归。我认为您可以将相同的原理应用于lme4包的模型。

让我们创建一个玩具数据集,其中我们在两个不同的时间点测量了三个不同组的智商得分。

library(tidyverse)
library(broom)

df <- tibble(
  id = seq_len(90),
  IQ = rnorm(90, 100, 15),
  group = rep(c("A", "B", "C"), each = 30),
  time = rep(c("T1", "T2"), 45)
)

如果我们想为每个组建立一个回归模型,研究IQ得分和时间点之间的关系,我们只需要五行代码。
df %>%
  nest(-group) %>%
  mutate(fit = map(data, ~ lm(IQ ~ time, data = .)),
         results = map(fit, glance)) %>%
  unnest(results) %>%
  select(group, r.squared, p.value)

哪个会回来
 # A tibble: 3 x 3
  group r.squared p.value
  <chr>     <dbl>   <dbl>
1 A       0.0141    0.532
2 B       0.0681    0.164
3 C       0.00432   0.730

其中nest(-group)在您的tibbles中为每个组创建tibble,其中包含idIQtime的相应变量。然后,添加一个带有fit的新列mutate(),在其中为每个组应用一个回归模型,并添加一个包含结果的新列,我们在不久之后使用unnest()访问了正确返回的值glance()。在最后一步中,我们对三个感兴趣的值进行select()

要获得斜率,您还需要调用tidy()。也许可以以某种方式缩短代码,但是一种解决方案是
df %>%
  nest(-group) %>%
  mutate(fit = map(data, ~ lm(IQ ~ time, data = .)),
         results1 = map(fit, glance),
         results2 = map(fit, tidy)) %>%
  unnest(results1) %>%
  unnest(results2) %>%
  select(group, term, estimate, r.squared, p.value) %>%
  mutate(estimate = exp(estimate))

要对斜率求幂,可以只添加另一个mutate()语句。最后它返回
# A tibble: 6 x 5
  group term        estimate r.squared p.value
  <chr> <chr>          <dbl>     <dbl>   <dbl>
1 A     (Intercept) 3.34e+46   0.0141    0.532
2 A     timeT2      3.31e- 2   0.0141    0.532
3 B     (Intercept) 1.17e+47   0.0681    0.164
4 B     timeT2      1.34e- 3   0.0681    0.164
5 C     (Intercept) 8.68e+43   0.00432   0.730
6 C     timeT2      1.25e- 1   0.00432   0.730

请注意,估计值已取幂。如果没有幂运算,则可以使用base R调用再次检查斜率和p值
summary(lm(IQ ~ time, data = filter(df, group == "A")))

如果您使用更复杂的模型(lme4),则有一个名为lmerTest的软件包,该软件包提供lme4的包装函数,这些函数返回p值(至少对于我已经使用过的混合模型)。

对于glance()模型使用lme4时应多加警告,因为broom软件包的维护者将尝试new concept,在此他们将摘要统计信息外包给负责该模型的特定软件包开发人员。

关于r - R中按组运行的数百种线性回归,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51567914/

10-13 07:29