Jarek Statinowy

Jarek Statinowy Z zapałem do pracy

Temat: [Język R] Liniowa model regresji

Dzień Dobry

Mam kilka zmiennych x1... x4, Y i chcąc obliczyć liniową funkcję regresji więc wpisuję
model=lm(Y~x1+x2+x3+x4, Dane)

I mam wektor ve= (1,0,1,1)

Chcę by program na podstawie tego wektora obliczył model dla zmiennych x1,x3,x4 Czyli nie brał x2 bo w wektorze mamy zero. Jak to można napisać skoro w komendzie "lm" podaję nazwy zmiennych i są niejako dadawane.

Jak to zrobić by program sprawdził kilka scenariuszy np. Jeśli mam trzy różne wektory np. (1,0,1,1) i (1,0,0,1). Zakładam, że mogę to zapisać w macierz (tablicę) i brać po wierszu.

Wyniki chcę zapisać w macierz
[dla 1 kombinacji] a0,a1,a2,a3,a4,R^2modelu
[dla 2 kombinacji] a0,a1,a2,a3,a4,R^2modelu
[dla 3 kombinacji] a0,a1,a2,a3,a4,R^2modelu

wiem, że wypisane współczynników to
a0=model$coefficients[1]

ale ni w ząb nie wiem jak to połączyć by działało

Bardzo proszę o pomoc

Temat: [Język R] Liniowa model regresji

Mam wrażenie, że coś przekombinowałeś.

Jeśli dopasowujesz model regresji to dopasowujesz go do wszystkich zmiennych. Jeśli masz gdzieś brak danych, to możesz zastosować kilka strategii: wykluczanie obserwacji z brakami, zastępowanie braków średnią lub medianą itp.

Nie możesz dopasować jednego modelu do danych, dla każdej obserwacji biorąc tylko podzbiór zmiennych :)
Jarek Statinowy

Jarek Statinowy Z zapałem do pracy

Temat: [Język R] Liniowa model regresji

Może źle się wyraziłem, więc dowyjaśnie o co mi chodzi:

Mam Dane (przykładowe oczywiście)
x1 x2 x3 x4 Y
1 2 4 5 19
7 4 5 3 76
...
3 5 7 9 23

Teraz mogę chcieć (no mogę :) by program policzył
model<-lm(Y,x1,Dane)
i R mi to policzy
ale mogę chcieć by program policzył
model2<-lm(Y,x1+x2,Dane)
i program mi policzy drugi model

Ale skoro mam 4 zmienne to mogę stworzyć 2^4-1 =15 rożnych modeli, konkretnie taki

1 0 0 0
0 1 0 0
1 1 0 0
0 0 1 0
1 0 1 0
0 1 1 0
1 1 1 0
0 0 0 1
1 0 0 1
0 1 0 1
1 1 0 1
0 0 1 1
1 0 1 1
0 1 1 1
1 1 1 1

Gdzie 1 oznacza, że biorę daną zmienną do modelu a 0 nie

Więc teraz mnie nurtuje jak zadać programowi by do modelu wziął właśnie te zmienne a nie inne i to z automatu.

Następnie program ma mi oddać macierz ze współczynnikami i współczynnikiem determinacji dla danej kombinacji czyli dla 1 0 1 0 program ma mi policzyć
model<-lm(Y,x1+x3,Dane)
i wypisać współczynniki a0,a1,0,a3,0 ,R2 (zapis do jakijś macierzy) bo nie bierze drugiej zmiennej do modelu ani trzeciej
a dla 1 0 0 1 powinien policzyć model<-lm(Y,x1+x4,Dane) i wypisać w macierzy
b0,a1,0,0,b4,R2

Problem w tym, że nie umiem "zmusić programu" by na podstawie wektora 0-1 brał tylko zmienne dla których w wektorze jest wartość 1

Temat: [Język R] Liniowa model regresji

Nie mam pojęcia, co masz na celu - podaję jedynie rozwiązanie problemu.
Proszę:
data <- data.frame(y=rnorm(10), x1=rnorm(10), x2=rnorm(10),  x3=rnorm(10))
varNames <- colnames(data)

n <- ncol(data)-1

varIDs <- lapply(list(c(1,0,1), c(1,1,1), c(0,0,1)), "*", seq_len(n))
varIDs <- lapply(varIDs, function(x) { replace(x, x==0, NA) } )

formulas <- lapply(varIDs, function(x) {
as.formula(paste0("y~", paste(varNames[na.omit(x+1)], collapse="+")))
})

(models <- lapply(formulas, function(f) { lm(f, data=data)}))

[[1]]
Call:
lm(formula = f, data = data)

Coefficients:
(Intercept) x1 x3
0.139230 0.006988 0.523234

[[2]]
Call:
lm(formula = f, data = data)

Coefficients:
(Intercept) x1 x2 x3
-0.2536 -0.2171 1.0712 0.5939

[[3]]
Call:
lm(formula = f, data = data)

Coefficients:
(Intercept) x3
0.1416 0.5218


A tutaj rozwiązanie dla wszystkich kombinacji zmiennych:
data <- data.frame(y=rnorm(10), x1=rnorm(10), x2=rnorm(10), 	x3=rnorm(10))
varNames <- colnames(data)

varIDs <- unlist(lapply(1:n, function(x) { combn(1:n, x, simplify=F) } ), recursive=F)

formulas <- lapply(varIDs, function(x) {
as.formula(paste0("y~", paste(varNames[x+1], collapse="+")))
})

models <- lapply(formulas, function(f) { lm(f, data=data)})


---
Przy okazji:
http://www.stefvanbuuren.nl/mi/Software.html
rstudio-pubs-static.s3.amazonaws.com/4625_fa990d611f024ea69e7e2b10dd228fe7.html

oraz http://cejsh.icm.edu.pl/cejsh/element/bwmeta1.element....Ten post został edytowany przez Autora dnia 29.01.16 o godzinie 13:56

Temat: [Język R] Liniowa model regresji

Ogólna funkcja, która może Ci się przydać



mask_lm <- function(y,input,mask)
{
fit <- lm(y ~.,input[which(mask == TRUE)])
return(fit)
}



y - zmienna zależna
x - macierz zmiennych niezależnych (każda kolumna to 1 zmienna)
mask - wektor wartości logicznych - włączone do modelu zostaną tylko kolumny z X, dla których odpowiednie pole mask wynosi TRUE lub inną wartość ewaluującą się do TRUE.
Jarek Statinowy

Jarek Statinowy Z zapałem do pracy

Temat: [Język R] Liniowa model regresji

Dziękuje bardzo za zainteresowanie. Zaraz zabieram się za testowanie

Mając 4 dane nie chcę robić doboru zmiennych tylko metodą "brutalnej siły" wypisać wszystkie modele dla tych zmiennych (współczynniki przy zmiennych) i R2 dla wstępnej werfikacji.

Tylko nie wiedziałem jak zadać programowi by mi pomijał pewne zmienne zmienne w komendzie lm

Dopiero zaczynam przygodę z tym programem więc będę często zaglądał .

Pozdrawiam

Temat: [Język R] Liniowa model regresji



x <- rnorm(100,1,10)
w <- rnorm(100,1,10)
y <- x + w + rnorm(100,1,5)

dat <- data.frame(cbind(y,x,w))

mask_lm <- function(mask,y,input)
{
fit <- lm(y ~.,input[which(mask == TRUE)])
res <- rep(NA,length(mask)+1)
i <- 1
j <- 1
for(x in c(TRUE,mask))
{
if(x)
{
res[j] = fit$coefficients[i]
i = i+1
}
else
{
res[j] = 0
}
j = j+1
}
return(c(mask,res,summary(fit)$r.squared))
}

masks = rbind(c(0,1),c(1,0),c(1,1))
result <- t(apply(masks, 1, mask_lm, dat[,1], dat[,2:length(dat[1,])]))
print(result)

Temat: [Język R] Liniowa model regresji

Ja zaglądam już dość rzadko, ale na Pawła zawsze możesz liczyć, zjadł zęby na R :)

Temat: [Język R] Liniowa model regresji

Zęby to może nie, ale ogarniam coraz więcej i chętnie porozwiązuję problemy ;)

Ogólnie moja wersja nie jest zbyt elegancka, ale da Ci dokładnie to, czego chcesz, czyli jedną macierz w której w pierwszych kolumnach masz maskę, w kolejnych wartości współczynników, z których pierwsza odpowiada wyrazowi wolnemu, a na końcu R^2. W wierszach oczywiście poszczególne modele.

Wersja Adriana zrobi to samo, tylko zwróci wyniki w formie listy.

A co do doboru zmiennych do modelu - są różne metody, w tym metoda krokowa.
Ponadto R^2 nie jest zbyt dobrą miarą do porównywania jakości modeli - polecam BIC albo AIC.

Wypróbuj funkcję stepAIC z pakietu MASS.
Jarek Statinowy

Jarek Statinowy Z zapałem do pracy

Temat: [Język R] Liniowa model regresji

Jeszcze może podrąże :) temat

Załóżmy, że mam kilka danych objaśniających (5 konkretnie) i metodą Hellwiga badam które wziąć.
Stosowny program napisałem by mi to obliczył i teraz chciałbym by program dla tych wybranych zmiennych policzył mi model liniowy i wypisał pewne dane (współczynniki i R^2)

Próbowałem przerobić wcześniejsze wasze wpisy ale coś mi nie idzie z jednym wektorem.

Pewnie to jakiś szczegół ale nie mogę dojść co nie tak

wynik który dostaje jest zapisany w kategorii values (Używam RStudio) pod nazwą vec
Var1 Var2 Var3 Var4 Var5
1 0 1 0 1

Czyli mam mieć model y=a0+a1X1+a3X3+a5X5

Jak więc zapisać model= lm(y~vec) by to mi działało

Dalej chyba już dam radę
współczynniki to model$coefficients[1] wyraz wolny itd
R^2 summary(model)$r.squared

Proszę o pomoc - jak to mam zapisać + ewentualnie inne cenne wskazówki

Chciałbym jeszcze zapytać o taką rzecz:
Hellwig działa w oparciu o R^2 a czy jest wygodny sposób by program prześledził mi optymalny dobór zmiennych pod katem AIC? Czy to już za duże kombinowanie :)

Pozdrawiam

Temat: [Język R] Liniowa model regresji

Jeśli masz wektor maski, dajmy na to:


0 1 1 0 1


oraz macierz zmiennych niezależnych (nazwijmy ją m), w której masz 5 zmiennych, ale chcesz włączyć jako niezależne do modelu tylko te, dla których odpowiednia w kolejności wartość wektora maski wynosi 1, to możesz to zrobić tak:



fit <- lm(y ~ .,data=m[,which(mask == 1)])



Co to oznacza?

which(mask == 1) zwróci dla naszej maski taki wektor: 2 3 5, czyli pozycje, na których w wektorze maski wartość jest równa 1.

Możemy użyć tego wektora jako wektora indeksującego kolumny w naszym wektorze danych i w ten sposób wybrać do analizy część z nich, dodajemy go po przecinku w nawiasach prostokątnych, bo interesuje nas tylko filtrowanie kolumn, wiersze bierzemy wszystkie.

y ~ . to formuła oznaczająca y od wszystkich kolumn przekazanych w argumencie data.Ten post został edytowany przez Autora dnia 01.02.16 o godzinie 17:03

Temat: [Język R] Liniowa model regresji

Jarek S.:
Hellwig działa w oparciu o R^2

...i w XXI wieku stanowi raczej rodzimą atrakcję, niż użyteczne narzędzie.
a czy jest wygodny sposób by program prześledził mi optymalny dobór zmiennych pod katem AIC? Czy to już za duże kombinowanie :)

np. regresja krokowa: http://www.stat.columbia.edu/~martin/W2024/R10.pdf

Od razu też umieszczę stosowne ostrzeżenie:
"Minister Zdrowia i Statystyki ostrzega: automatyczny dobór zmiennych w połączeniu z bezkrytyczną akceptacją wyników może prowadzić do nowotworów, impotencji i zaćmy".Ten post został edytowany przez Autora dnia 01.02.16 o godzinie 17:44

Temat: [Język R] Liniowa model regresji

Przede wszystkim, w twoim przypadku porównywanie modeli według R^2 jest kompletnie bezcelowe. Bez znajomości twoich danych mogę powiedzieć, że według tego kryterium najlepszy będzie model, do którego włączysz wszystkie predyktory. Tylko czy będzie on najlepszy do również do prognozowania, albo wyjaśniania zależności w populacji? Otóż niekoniecznie, bo możesz go "przeuczyć" na swoich danych - będzie świetnie dopasowany do danych z próby i przeciętnie do danych z populacji. Właśnie do tego służą kryteria informacyjne, że biorą pod uwagę tradeoff pomiędzy jakością dopasowania modelu do danych i liczbą informacji w modelu.

EDIT:

Mam pomysł, jak uzyskać świetne R^2. Dla każdej obserwacji w modelu dodaj dummy zmienną - 1, jeśli to ta obserwacja, a 0 jeśli inna. Będziesz miał świetnie dopasowany do danych model :DTen post został edytowany przez Autora dnia 01.02.16 o godzinie 17:52
Jarek Statinowy

Jarek Statinowy Z zapałem do pracy

Temat: [Język R] Liniowa model regresji

Coś mi jednak nie idzie ;/

Dane<-read.csv2("D:/programHeJN/DWejscYX.csv") Y i 5 X-ów
...
Hellwig (jest ok bo już przetestowałem na kilku przykładach)
...
doModelu<-c(as.vector(tab[maks,]))
[1] 10101 Taki mam wynik

I teraz chciałem wstawić Twoją propozycję
------------
mask_lm <- function(mask,y,input)
{
fit <- lm(y ~.,input[which(mask == TRUE)])
res <- rep(NA,length(mask)+1)
i <- 1
j <- 1
for(x in c(TRUE,mask))
{
if(x)
{
res[j] = fit$coefficients[i]
i = i+1
}
else
{
res[j] = 0
}
j = j+1
}
return(c(mask,res,summary(fit)$r.squared))
}

aaa<-as.vector(doModelu)

result <- t(apply(aaa, 1, mask_lm, dat[,1], dat[,2:length(dat[1,])]))
print(result)
------------

Ale guzik - nie chce iść. Zmieniłem nazwy tabel by pasowały wiem, że nie mam tablicy dat ze zmiennymi tylko Dane.

Z góry dzięki za pomoc
Pozdrawiam

A co do doboru danych - to owszem wiem, że nie ma co ślepo ufać takim wynikom. Teraz tylko sie uczę używać programu R więc wymyślam co ma mi policzyć i staram się pisać. Kilka "programów" już mam ale jeszcze dużo przede mną :)

Temat: [Język R] Liniowa model regresji

Jaki błąd dostajesz?
Jarek Statinowy

Jarek Statinowy Z zapałem do pracy

Temat: [Język R] Liniowa model regresji

aaa<-as.vector(doModelu)
>
result <- t(apply(aaa, 1, mask_lm, dat[,1], dat[,2:length(dat[1,])]))
Error in apply(aaa, 1, mask_lm, dat[, 1], dat[, 2:length(dat[1, ])]) :
dim(X) must have a positive length
> print(result)
Error in print(result) : object 'result' not found

Coś takiego wyskoczyło

Temat: [Język R] Liniowa model regresji

Ale dlaczego podajesz tylko jeden wektor, a nie macierz? Przecież chodziło Ci o to, żeby jednym zamachem dopasować bardzo dużo modeli. Twoje aaa powinno być macierzą masek, np:


[,1][,2][,3][,4]
[1,] 1 1 1 0
[2,] 1 0 0 1

... i tak dalej



Jeśli chcesz koniecznie spróbować z jednym wektorem (chociaż jaki ma to sens, skoro po prostu możesz dopasować ręcznie odpowiadający mu model) to zamiast

aaa<-as.vector(doModelu) 


daj

aaa<-rbind(doModelu) 
Ten post został edytowany przez Autora dnia 02.02.16 o godzinie 15:20
Jarek Statinowy

Jarek Statinowy Z zapałem do pracy

Temat: [Język R] Liniowa model regresji

*****************
"Ale dlaczego podajesz tylko jeden wektor, a nie macierz? Przecież chodziło Ci o to, żeby jednym zamachem dopasować bardzo dużo modeli"
*****************

Ponieważ jeden wektor mam z metody Hellwiga, więc teraz chciałem by dla tego jednego wektora program policzył mi model liniowy i R2

To już jest inny program - chciałem połączyć metodę doboru zmiennych (Hellwiga) który zwraca mi wektor 0-1 z programem który oblicza mi model na podstawie wektora 0-1

Muszę jeszcze znaleźć sposób na wyłuskanie samego R2 z twojego programu (jako nowej zmiennej RR) ale to już chyba wiem jak zrobić.

Jak mówiłem dopiero się uczę programu więc zadaje sobie rożne projekty i staram się to napisać. Małe sukcesy mam ale bardzo dużo jeszcze przede mną.

Dziękuje za podpowiedź - działa :)

Pozdrawiam



Wyślij zaproszenie do