La régression linéaire dans R (normal et logarithmique des données)
J'ai envie de faire une régression linéaire dans R pour les données dans un normal et un double logarithmique de la parcelle.
Pour de données normales le jeu de données pourraient être les suivantes:
lin <- data.frame(x = c(0:6), y = c(0.3, 0.1, 0.9, 3.1, 5, 4.9, 6.2))
plot (lin$x, lin$y)
Je veux calculer dessiner une ligne pour la régression linéaire seulement des points de données 2, 3 et 4.
Pour double logarithmique des données l'ensemble de données pourrait être la suivante:
data = data.frame(
x=c(1:15),
y=c(
1.000, 0.742, 0.623, 0.550, 0.500, 0.462, 0.433,
0.051, 0.043, 0.037, 0.032, 0.028, 0.025, 0.022, 0.020
)
)
plot (data$x, data$y, log="xy")
Ici, je tiens à attirer la droite de régression pour les ensembles de données 1:7 et 8:15.
Ho puis-je calculer la pente et la y-offset la sla ainsi que les paramètres de l'ajustement (R^2, p-valeur)?
Comment est-il fait pour le mode normal et pour logarithmique des données?
Merci pour votre aide,
Sven
Vous devez vous connecter pour publier un commentaire.
Dans R, linéaire par les moindres carrés modèles sont équipés par la
lm()
fonction. À l'aide de la formule de l'interface, nous pouvons utiliser lasubset
argument pour sélectionner les points de données utilisés pour adapter le modèle actuel, par exemple:donner:
Comme pour le double journal, vous avez deux choix, je suppose; i) l'estimation de deux modèles distincts comme nous l'avons fait ci-dessus, ou ii) estimation par analyse de covariance. Le journal de transformation se fait dans la formule à l'aide de
log()
.Par l'intermédiaire de deux modèles distincts:
Ou par analyse de covariance, où nous avons besoin d'une variable indicatrice
Vous pourriez vous demander si ces deux approches sont équivalentes? Bien qu'ils sont et nous pouvons montrer ce via les coefficients du modèle.
De sorte que les deux pentes sont -0.4306 et -1.4967 pour les différents modèles. Les coefficients pour l'analyse de covariance du modèle sont:
Comment pouvons-nous concilier les deux? Eh bien la façon dont j'ai configuré
ind
,logm3
est réglée pour donner plus directement les valeurs estimées à partir delogm2
; l'intercepte delogm2
etlogm3
sont les mêmes, comme le sont les coefficients pourlog(x)
. Pour obtenir les valeurs équivalentes pour les coefficientsde
logm1
, nous avons besoin de faire une manipulation, d'abord pour l'ordonnée à l'origine:où le coefficient de
indTRUE
est la différence entre la moyenne du groupe 1 au-dessus de la moyenne du groupe 2. Et pour la pente:qui est le même que nous avons obtenu pour
logm1
et est basé sur la pente pour le groupe 2 (coefs[2]
) modifié par la différence de pente pour le groupe 1 (coefs[4]
).Comme pour le dessin technique, un moyen facile est via
abline()
pour des modèles simples. E. g. pour les données normales exemple:Des données du journal, nous avons besoin de nous pour être un peu plus créatif, et la solution générale à ce problème est de prédire plus de la gamme de données et de tracer les prédictions:
Qui peut tracer sur l'échelle d'origine, par exponentiating
yhat
ou sur l'échelle de log:
Par exemple...
Cette solution générale fonctionne bien pour les plus complexes ANCOVA modèle trop. Ici, j'ai créer un nouveau pdat comme avant, et d'ajouter un indicateur
Remarquez comment nous obtenons toutes les prédictions que nous voulons le seul appel à
predict()
en raison de l'utilisation de l'analyse de covariance pour s'adapter àlogm3
. Nous pouvons maintenant tracer en avant:str(coef(daten_fit))
donne:Named num 0.8 - attr(*, "names")= chr "x"
, mais est en quelque sorte possible de demander coef pour obtenir la valeur avec le nom "x". J'ai essayé différentes pense commecoeff(daten_fit)$x
oucoeff(daten_fit)[1]
ouattr(coeff(daten_fit), "x")
,... mais rien n'a fonctionné. Il n'est pas possible d'obtenir la valeur par son nom?coef()
avec un "f" pascoeff()
avec deux.coef(logm2)["(Intercept)"]
etcoef(logm2)["log(x)"]
travail pour moi sur lalogm2
objet de ma réponse. Vous ne pouvez pas utiliser$
sur un atomique vecteur (vecteur d'un type de base), il ne fonctionne que sur une liste (et blocs de données qui sont bien sûr des listes).En général, le fractionnement des données dans les différents groupes et l'exécution de modèles différents sur différents sous-ensembles est inhabituel, et probablement une mauvaise forme. Vous souhaitez peut-être envisager d'ajouter un groupement variable
et en cours d'exécution une sorte de modèle sur l'ensemble du jeu de données, par exemple,