Minimi quadrati ponderati in r
-
21-12-2019 - |
Domanda
Il mio set di dati è abbastanza grande, quindi sto solo usando 10 righe di dati come esempio (ho elaborato la risposta in Excel ma non riesco a replicare in R-come ho bisogno di aiuto con il codice): < / P >.
constant<-c(6.10,5.12,5.04,4.97,4.89,4.89,4.87,4.87,4.88,4.99)
years.star<-c(219.87,153.69,146.19,139.35,127.27,127.27,121.91,121.91,112.28,99.98)
years.sq.star<-c(7915.41,4610.71,4239.78,3901.93,3309.27,3309.27,3047.95,3047.95,2582.58,1999.62)
ln.salary<-c(28.43,23.12,21.59,21.44,22.71,23.33,20.29,21.76,21.48,22.92)
try<-data.frame(constant,years.star,years.sq.star,ln.salary)
.
ln.salany è la variabile dipendente. La risposta che dovresti ottenere è:
intercept- 6.474922
beta1- -0.15026
beta2- 0.002769
.
Il mio problema è che in R, se utilizzo la funzione LM, non sa che la mia intercettazione ha i valori sopra. Utilizza solo 1,1,1,1,1,1,1,1,1,1,1 invece di 6,10,5.12, ecc.
così test<-lm(ln.salary~years.star+years.sq.star,data=try,weights=constant)
non funziona perché genera questa risposta:
intercept- 207.1706
beta1- -3.13214
beta2- 0.064416
.
In sostanza, ho preso i dati e ho cercato di adattarsi per l'eteroscidateità. Nel passo finale, ho la mia stella costante e le mie variabili X trasformtate. L'ultimo passo è di regredire ln.salary sulle variabili costanti e x per darmi la risposta che dovresti ottenere come sopra.
Posso farlo in Excel ma non in r e so che non sto ottenendo il codice giusto. Conosco la funzione LM che genera intercetta (1,1,1 ...) è il problema. Per favore, ti aiuterebbe.
Cordiali saluti D
Soluzione
Se si desidera variare "intercettazioni" per ogni riga, è necessario utilizzare un 'offset' piuttosto che un 'peso':
test<-lm(ln.salary~years.star+years.sq.star+0,data=try,offset=constant)
Call:
lm(formula = ln.salary ~ years.star + years.sq.star + 0, data = try,
offset = constant)
Coefficients:
years.star years.sq.star
0.236355 -0.003881
.
Non sono così colpito dal fatto che questo non è d'accordo con Excel.Il programma di regressione lineare del programma è noto per essere piuttosto più pallido.Se d'altra parte sei sicuro di essere necessario utilizzare pesi, è necessario chiarire quale delle tre diverse interpretazioni possibili del termine viene utilizzata.(Scelte: replica, campionamento, varianza inversa).L'interpretazione lm
di un "peso" è la versione inverso della varianza.(È descritto nella sua pagina di aiuto come "inversamente proporzionale alla varianza), quindi se quei" costanti "-Terms sono varianti, allora forse vuoi:
> (test<-lm(ln.salary~years.star+years.sq.star+0, data=try, weights=1/constant) )
Call:
lm(formula = ln.salary ~ years.star + years.sq.star + 0, data = try,
weights = 1/constant)
Coefficients:
years.star years.sq.star
0.309391 -0.005189
. Altri suggerimenti
Se si desidera "risolvere" un'intercettazione a una particolare costante, è necessario sottrarre il valore di quella costante dalla risposta, quindi montare un modello di non intercettazione.Ad esempio
test <- lm( ln.salary - 6.474922 ~ years.star + years.sq.star + 0,
data=try, weights=constant)
.
Qui sottraiamo il termine di intercettazione, e quindi aggiungiamo +0
alla formula per indicare di non adattarsi a un termine di intercettazione.Con quel modello ottengo
Call:
lm(formula = ln.salary - 6.474922 ~ years.star + years.sq.star +
0, data = try, weights = constant)
Coefficients:
years.star years.sq.star
0.197384 -0.002842
.