【问题标题】:Fitting a linear regression model by group gives NaN p-values按组拟合线性回归模型会给出 NaN p 值
【发布时间】:2017-01-24 21:28:56
【问题描述】:

我正在使用plyr::ddply 运行回归模型

model <- rating ~ A + B + C + D + E + F

系数resp.id。我可以通过每个因素创建一个 beta 数据框:

indiv.betas <- ddply(data.coded, "resp.id",
                     function(df) coef(lm(model, data=df)))

我现在尝试使用以下因子提取变量的 p 值:

indiv.pvalues <- ddply(data.coded, "resp.id",
                       function(df) coef(summary(lm(model, data=df)))[, "Pr(>|t|)"])

不幸的是,它只是给了我一个带有NaN 的数据框。

虽然,如果我在整个数据集上运行一个模型,我可以成功地从这个模型中提取 p 值作为数据框:

pvalue <- as.data.frame(coef(summary(lm(model, data=df)))[, "Pr(>|t|)"])

如何按因子创建 p 值的数据框?

谢谢。

【问题讨论】:

  • 您应该在示例输入数据中包含一个reproducible example,以便我们可以运行代码来测试它,看看发生了什么。

标签: r regression linear-regression lm


【解决方案1】:

当你适合单个模型时

rating ~ A + B + C + D + E + F

您会得到有意义的非 NA 结果。当您通过resp.id 为每个子集/因子级别拟合相同的模型时,您会得到NaN 结果。我 100% 确信,对于某些因素水平,您没有足够的数据来拟合上述模型。最好先检查每个组有多少数据。您可以使用:

N <- with(data.coded, tapply(rating, resp.id, FUN = length))

您的模型有 7 个系数(1 个用于截距,1 个用于 A、B、...、F)。所以which(N &lt; 7) 会告诉你哪些因子水平产生了NaN


在这一部分中,我将证明我无法用iris 数据集重现您的问题。

library(plyr)

model <- Sepal.Length ~ Sepal.Width + Petal.Length + Petal.Width

ddply(iris, "Species", function(df) coefficients(lm(model, data=df)))

#     Species (Intercept) Sepal.Width Petal.Length Petal.Width
#1     setosa    2.351890   0.6548350    0.2375602   0.2521257
#2 versicolor    1.895540   0.3868576    0.9083370  -0.6792238
#3  virginica    0.699883   0.3303370    0.9455356  -0.1697527

ddply(iris, "Species", function(df) coef(summary(lm(model, data=df)))[, 4])

#     Species  (Intercept)  Sepal.Width Petal.Length Petal.Width
#1     setosa 3.034183e-07 6.834434e-09 2.593594e-01    0.470987
#2 versicolor 5.112246e-04 6.488965e-02 1.666695e-06    0.125599
#3  virginica 1.961563e-01 6.439972e-02 1.074269e-13    0.395875

在这一部分中,我将说明为什么当系数多于数据时会出现NaN

set.seed(0);
x1 <- rnorm(3); x2 <- rnorm(3); x3 <- rnorm(3)
y <- rnorm(3)

fit <- lm(y ~ x1 + x2 + x3)  ## 3 data, 4 coefficients

coef(summary(fit))
#             Estimate Std. Error t value Pr(>|t|)
#(Intercept) 0.4217653        NaN     NaN      NaN
#x1          0.4124869        NaN     NaN      NaN
#x2          1.1489330        NaN     NaN      NaN

【讨论】:

  • 关于最后一部分,如果你运行fit &lt;- lm(y ~ x1 + x2) ## 3 data, 3 coefficients,你仍然会得到NaN。你将如何改变它?谢谢
猜你喜欢
  • 2020-06-10
  • 1970-01-01
  • 2018-03-17
  • 2018-10-13
  • 2017-12-16
  • 1970-01-01
  • 1970-01-01
  • 2020-10-22
  • 2016-04-23
相关资源
最近更新 更多