Estoy utilizando la regresión lineal robusta rlm del paquete MASS en el conjunto de datos del iris modificado de la siguiente manera:
> myiris = iris
> myiris$Species = as.numeric(myiris$Species)
> head(myiris)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 1
2 4.9 3.0 1.4 0.2 1
3 4.7 3.2 1.3 0.2 1
4 4.6 3.1 1.5 0.2 1
5 5.0 3.6 1.4 0.2 1
6 5.4 3.9 1.7 0.4 1
> library(MASS)
> rmod = rlm(Species~., data=myiris)
> rmod
Call:
rlm(formula = Species ~ ., data = myiris)
Converged in 6 iterations
Coefficients:
(Intercept) Sepal.Length Sepal.Width Petal.Length Petal.Width
1.14943807 -0.11067690 -0.02603537 0.21581357 0.63793686
Degrees of freedom: 150 total; 145 residual
Scale estimate: 0.191
>
> sumrmod = summary(rmod)
> sumrmod
Call: rlm(formula = Species ~ ., data = myiris)
Residuals:
Min 1Q Median 3Q Max
-0.59732 -0.15769 0.01089 0.10955 0.56317
Coefficients:
Value Std. Error t value
(Intercept) 1.1494 0.2056 5.5906
Sepal.Length -0.1107 0.0579 -1.9128
Sepal.Width -0.0260 0.0599 -0.4346
Petal.Length 0.2158 0.0571 3.7821
Petal.Width 0.6379 0.0948 6.7287
Residual standard error: 0.1913 on 145 degrees of freedom
Esto no da valores p.así que los calculé de la siguiente manera (usando la función pt de la base R):
> dd = data.frame(sumrmod$coefficients) #$
> dd$p.value = pt(dd$t.value, sumrmod$df[2]) #$
> dd
Value Std..Error t.value p.value
(Intercept) 1.14943807 0.20560264 5.5905804 0.99999995
Sepal.Length -0.11067690 0.05786107 -1.9128044 0.02887227
Sepal.Width -0.02603537 0.05991073 -0.4345693 0.33226054
Petal.Length 0.21581357 0.05706173 3.7821068 0.99988663
Petal.Width 0.63793686 0.09480869 6.7286751 1.00000000
Sin embargo, esto no es correcto ya que la función lm ordinaria y otras funciones de regresión muestran que Pétalo.Longitud y Pétalo.Anchura son altamente significativas en esta regresión:
> summary(lm(Species~., data=myiris))
Call:
lm(formula = Species ~ ., data = myiris)
Residuals:
Min 1Q Median 3Q Max
-0.59215 -0.15368 0.01268 0.11089 0.55077
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 1.18650 0.20484 5.792 4.15e-08 ***
Sepal.Length -0.11191 0.05765 -1.941 0.0542 .
Sepal.Width -0.04008 0.05969 -0.671 0.5030
Petal.Length 0.22865 0.05685 4.022 9.26e-05 ***
Petal.Width 0.60925 0.09446 6.450 1.56e-09 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.2191 on 145 degrees of freedom
Multiple R-squared: 0.9304, Adjusted R-squared: 0.9285
F-statistic: 484.5 on 4 and 145 DF, p-value: < 2.2e-16
¿Dónde está el error? ¿No estoy utilizando el método correcto para calcular el valor p?
Edición: Como sugiere (además) @Glen_b en los comentarios:
> dd$p.value = 2*pt(abs(dd$t.value), sumrmod$df[2], lower.tail=FALSE) #$
> dd
Value Std..Error t.value p.value
(Intercept) 1.14943807 0.20560264 5.5905804 1.089792e-07
Sepal.Length -0.11067690 0.05786107 -1.9128044 5.774455e-02
Sepal.Width -0.02603537 0.05991073 -0.4345693 6.645211e-01
Petal.Length 0.21581357 0.05706173 3.7821068 2.267410e-04
Petal.Width 0.63793686 0.09480869 6.7286751 3.691993e-10
Parece que son correctos (por fin).
2 votos
Aunque fuera correcto utilizar una distribución t para este cálculo, no parece que estés calculando correctamente los valores p.
0 votos
Sigues sin calcular correctamente. Considera detenidamente lo que estás calculando cuando la estadística es negativa. Piensa en el uso de
abs
en la estadística, y no utilice1-
, fije ellower.tail
en sentido contrario en la llamada apt
0 votos
He editado la última parte de mi respuesta. ¿Es éste el método correcto?
0 votos
Intente hacer los mismos cálculos con
lm
y verá inmediatamente si el enfoque funciona correctamente.0 votos
Creo que tengo que multiplicar por 2 para que el valor P sea correcto (?2 caras).
0 votos
Eso parece correcto. Si ahora miras
summary.lm
(escríbelo en la consola), encontrarás este trozo de código:ans$coefficients <- cbind(est, se, tval, 2 * pt(abs(tval),
rdf, lower.tail = FALSE))
... y el último elemento de los argumentos decbind
existe la columna p-valor en la tabla de regresión cuando se llama asummary
en unlm
objeto0 votos
Tengo que multiplicar por 2 para obtener un valor de 2 colas, pero ¿cuándo debo hacer que lower.tail=FALSE?
0 votos
Utilizando
abs
estás haciendo que la estadística sea positiva, y entonces tienes que buscar en la cola superior. Así que eso sería "cuando se utilizaabs
"