[英]Fitting a linear regression model by group gives NaN p-values
我正在使用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值的数据框?
谢谢。
当您适合单个模型时
rating ~ A + B + C + D + E + F
您会得到有意义的非NA结果。 当您通过resp.id
为每个子集/因子水平拟合相同的模型时,您将获得NaN
结果。 我100%地确定,在某种程度上,您没有足够的数据来满足上述模型。 最好先检查每个组有多少数据。 您可以使用:
N <- with(data.coded, tapply(rating, resp.id, FUN = length))
您的模型有7个系数(截距1个,A,B,...,F每个1个)。 因此which(N < 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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.