2016-09-16 4 views
0

Я использую plyr::ddply для запуска модели регрессииПодгонка модели линейной регрессии по группам дает NaN р-значения

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

на коэффициент resp.id. Я могу создать кадр данных из беты каждого фактора с:

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

Я теперь пытаюсь извлечь р-значения для переменного коэффициента использования:

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

К сожалению, это просто дает мне фрейм данных с NaN.

Хотя, если я бег модели через весь набор данных, я могу извлечь р-значение из этой модели в качестве кадра данных успешно с:

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

Как я могу создать фрейм данных p-значениями фактора?

Спасибо.

+0

Вы должны включить [воспроизводимый пример] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) с входными данными выборки, чтобы мы могли запустите код, чтобы проверить его, чтобы узнать, что происходит. – MrFlick

ответ

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 < 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 
Смежные вопросы