按组拟合线性回归模型给出 NaN p 值
Fitting a linear regression model by group gives NaN p-values
我正在使用 plyr::ddply
到 运行 回归模型
model <- rating ~ A + B + C + D + E + F
乘以 resp.id
。我可以通过以下每个因素创建贝塔数据框:
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 个用于截距,1 个用于 A、B、...、F)。所以 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
我正在使用 plyr::ddply
到 运行 回归模型
model <- rating ~ A + B + C + D + E + F
乘以 resp.id
。我可以通过以下每个因素创建贝塔数据框:
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 个用于截距,1 个用于 A、B、...、F)。所以 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