Regresi linier tidak pas


9

Saya melakukan regresi linier menggunakan fungsi Rm:

x = log(errors)
plot(x,y)
lm.result = lm(formula = y ~ x)
abline(lm.result, col="blue") # showing the "fit" in blue

masukkan deskripsi gambar di sini

tapi itu tidak pas. Sayangnya saya tidak bisa memahami manualnya.

Bisakah seseorang mengarahkan saya ke arah yang benar agar lebih cocok?

Maksud saya, saya ingin meminimalkan Root Mean Squared Error (RMSE).


Sunting : Saya telah mengirim pertanyaan terkait (ini masalah yang sama) di sini: Dapatkah saya mengurangi RMSE lebih lanjut berdasarkan fitur ini?

dan data mentah di sini:

http://tny.cz/c320180d

kecuali bahwa pada tautan x itulah yang disebut kesalahan pada halaman ini di sini, dan ada lebih sedikit sampel (1000 vs 3000 di plot halaman ini). Saya ingin membuat hal-hal sederhana dalam pertanyaan lain.


4
Rlm berfungsi seperti yang diharapkan, masalahnya ada pada data Anda, yaitu hubungan linier tidak sesuai dalam kasus ini.
mpiktas

2
Bisakah Anda menggambar garis yang menurut Anda harus Anda dapatkan dan mengapa menurut Anda garis Anda memiliki MSE yang lebih kecil? Saya perhatikan kebohongan y Anda antara 0 dan 1, jadi sepertinya regresi linier akan sangat tidak cocok untuk data ini. Apa nilainya?
Glen_b -Reinstate Monica

2
Jika nilai y adalah probabilitas, Anda tidak ingin regresi OLS sama sekali.
Peter Flom

3
(maaf bisa memposting ini sebelumnya) Apa yang menurut Anda seperti "lebih cocok" di bawah ini adalah (kurang-lebih) meminimalkan jumlah kuadrat jarak ortogonal, bukan jarak vertikal 'intuisi Anda keliru. Anda dapat memeriksa perkiraan MSE dengan cukup mudah! Jika nilai-y adalah probabilitas, Anda sebaiknya dilayani oleh beberapa model yang tidak
melampaui

2
Bisa jadi regresi ini menderita dari adanya beberapa outlier. Bisa menjadi kasus untuk regresi yang kuat. en.wikipedia.org/wiki/Robust_regress
Yves Daoust

Jawaban:


18

Salah satu solusi paling sederhana mengakui bahwa perubahan di antara probabilitas yang kecil (seperti 0,1) atau yang komplemennya kecil (seperti 0,9) biasanya lebih bermakna dan pantas lebih berat daripada perubahan di antara probabilitas menengah (seperti 0,5).

Misalnya, perubahan dari 0,1 menjadi 0,2 (a) menggandakan probabilitas sementara (b) mengubah probabilitas komplementer hanya dengan 1/9 (menjatuhkannya dari 1-0,1 = 0,9 ke 1-0,2 menjadi 0,8), sedangkan perubahan dari 0,5 menjadi 0,6 (a) meningkatkan probabilitas hanya sebesar 20% sementara (b) mengurangi probabilitas komplementer hanya sebesar 20%. Dalam banyak aplikasi perubahan pertama adalah, atau setidaknya seharusnya, dianggap hampir dua kali lebih besar dari yang kedua.

Dalam situasi apa pun di mana akan sama artinya menggunakan probabilitas (dari sesuatu yang terjadi) atau komplemennya (yaitu, probabilitas sesuatu yang tidak terjadi), kita harus menghormati simetri ini.

Dua ide ini - untuk menghormati simetri antara probabilitas dan komplemennya dan menyatakan perubahan relatif daripada mutlak - menyarankan bahwa ketika membandingkan dua probabilitas dan kita harus melacak kedua rasio mereka dan rasio komplemen mereka . Saat melacak rasio, lebih mudah menggunakan logaritma, yang mengubah rasio menjadi perbedaan. Ergo, cara yang baik untuk mengekspresikan probabilitas untuk tujuan ini adalah dengan menggunakan yang dikenal sebagai log odds atau logitp1pppp/p(1p)/(1p)p

z=logplog(1p),
dari . Peluang log yang dipasang selalu dapat dikonversi kembali menjadi probabilitas dengan membalik logit; Baris terakhir dari kode di bawah ini menunjukkan bagaimana ini dilakukan.pz
p=exp(z)/(1+exp(z)).

Alasan ini agak umum: ini mengarah pada prosedur awal standar yang baik untuk mengeksplorasi setiap set data yang melibatkan probabilitas. (Ada metode yang lebih baik yang tersedia, seperti regresi Poisson, ketika probabilitas didasarkan pada pengamatan rasio "keberhasilan" untuk jumlah "percobaan," karena probabilitas berdasarkan lebih banyak percobaan telah diukur lebih andal. Itu tampaknya tidak menjadi kasus di sini, di mana probabilitas didasarkan pada informasi yang diperoleh. Seseorang dapat mendekati pendekatan regresi Poisson dengan menggunakan kuadrat terkecil tertimbang dalam contoh di bawah ini untuk memungkinkan data yang lebih atau kurang dapat diandalkan.)

Mari kita lihat sebuah contoh.

Tokoh

Plot sebar di sebelah kiri menunjukkan dataset (mirip dengan yang ada di pertanyaan) diplot dalam hal peluang log. Garis merah adalah kuadrat terkecil yang cocok. Ia memiliki rendah , menunjukkan banyak sebaran dan "regresi rata-rata" yang kuat: garis regresi memiliki kemiringan yang lebih kecil daripada sumbu utama awan titik elips ini. Ini adalah pengaturan yang biasa; mudah untuk menafsirkan dan menganalisis menggunakan 's fungsi atau setara.R2Rlm

Plot sebar di sebelah kanan mengekspresikan data dalam hal probabilitas, seperti yang awalnya dicatat. Kesesuaian yang sama diplot: sekarang terlihat melengkung karena cara nonlinier di mana peluang log dikonversi menjadi probabilitas.

Dalam arti root mean squared error dalam hal peluang log, kurva ini paling cocok.

Kebetulan, bentuk awan sekitar elips di sebelah kiri dan cara melacak garis kuadrat terkecil menunjukkan bahwa model regresi kuadrat paling masuk akal: data dapat dijelaskan secara memadai oleh hubungan linear - asalkan peluang log digunakan-- dan variasi vertikal di sekitar garis kira-kira sama ukurannya terlepas dari lokasi horizontal (homoscedasticity). (Ada beberapa nilai rendah yang luar biasa di tengah yang mungkin perlu dicermati lebih dekat.) Evaluasi ini secara lebih rinci dengan mengikuti kode di bawah ini dengan perintah plot(fit)untuk melihat beberapa diagnostik standar. Ini saja adalah alasan kuat untuk menggunakan peluang log untuk menganalisis data ini, bukan probabilitas.


#
# Read the data from a table of (X,Y) = (X, probability) pairs.
#
x <- read.table("F:/temp/data.csv", sep=",", col.names=c("X", "Y"))
#
# Define functions to convert between probabilities `p` and log odds `z`.
# (When some probabilities actually equal 0 or 1, a tiny adjustment--given by a positive
# value of `e`--needs to be applied to avoid infinite log odds.)
#
logit <- function(p, e=0) {x <- (p-1/2)*(1-e) + 1/2; log(x) - log(1-x)}
logistic <- function(z, e=0) {y <- exp(z)/(1 + exp(z)); (y-1/2)/(1-e) + 1/2}
#
# Fit the log odds using least squares.
#
b <- coef(fit <- lm(logit(x$Y) ~ x$X))
#
# Plot the results in two ways.
#
par(mfrow=c(1,2))
plot(x$X, logit(x$Y), cex=0.5, col="Gray",
     main="Least Squares Fit", xlab="X", ylab="Log odds")
abline(b, col="Red", lwd=2)

plot(x$X, x$Y, cex=0.5, col="Gray",
     main="LS Fit Re-expressed", xlab="X", ylab="Probability")
curve(logistic(b[1] + b[2]*x), col="Red", lwd=2, add=TRUE)

Terima kasih banyak atas jawabannya. Saya perlu waktu untuk mencobanya.
Timothée HENRY

Saya mengalami kesalahan saat mencoba kode Anda dengan data saya, ketika mencoba menyesuaikan peluang log: "Kesalahan di lm.fit (x, y, offset = offset, singular.ok = singular.ok, ...): NA / NaN / Inf dalam panggilan fungsi asing (arg 4) ".
Timothée HENRY

Silakan baca komentar dalam kode: mereka menjelaskan apa masalahnya dan apa yang harus dilakukan.
whuber

6

Mengingat kemiringan dalam data dengan x, hal pertama yang jelas harus dilakukan adalah menggunakan regresi logisitic ( tautan wiki ). Jadi saya dengan whuber tentang ini. Saya akan mengatakan bahwa dengan sendirinya akan menunjukkan signifikansi yang kuat tetapi tidak menjelaskan sebagian besar penyimpangan (setara dengan jumlah total kuadrat dalam OLS). Jadi orang mungkin menyarankan bahwa ada kovariat lain selain dari yang membantu kekuatan penjelas (mis. Orang yang melakukan klasifikasi atau metode yang digunakan), data Anda sudah [0,1] walaupun: apakah Anda tahu apakah itu mewakili probabilitas atau kejadian rasio? Jika demikian, Anda harus mencoba regresi logistik menggunakan diubah (sebelum rasio / probabilitas).xxyy

Pengamatan Peter Flom hanya masuk akal jika y Anda bukan probabilitas. Periksa plot(density(y));rug(y)di ember berbeda dan lihat apakah Anda melihat distribusi Beta yang berubah atau jalankan saja . Perhatikan bahwa distribusi beta juga merupakan distribusi keluarga eksponensial dan oleh karena itu dimungkinkan untuk memodelkannya dengan R.xbetaregglm

Untuk memberi Anda gambaran tentang apa yang saya maksud dengan regresi logistik:

# the 'real' relationship where y is interpreted as the probability of success
y = runif(400)
x = -2*(log(y/(1-y)) - 2) + rnorm(400,sd=2) 
glm.logit=glm(y~x,family=binomial); summary(glm.logit) 
plot(y ~ x); require(faraway); grid()
points(x,ilogit(coef(glm.logit) %*% rbind(1.0,x)),col="red")
tt=runif(400)  # an example of your untransformed regression
newy = ifelse(tt < y, 1, 0)
glm.logit=glm(newy~x,family=binomial); summary(glm.logit) 

# if there is not a good match in your tail probabilities try different link function or oversampling with correction (will be worse here, but perhaps not in your data)
glm.probit=glm(y~x,family=binomial(link=probit)); summary(glm.probit)
glm.cloglog=glm(y~x,family=binomial(link=cloglog)); summary(glm.cloglog)

Regresi logistik di mana model sebenarnya adalah $ log (\ frac {p} {1-p}) = 2-0.5x

EDIT: setelah membaca komentar:

Mengingat bahwa "Nilai-nilai y adalah probabilitas dari kelas tertentu, yang diperoleh dari rata-rata klasifikasi yang dilakukan secara manual oleh orang-orang," Saya sangat merekomendasikan melakukan regresi logistik pada data dasar Anda. Berikut ini sebuah contoh:

Asumsikan Anda melihat probabilitas seseorang menyetujui proposal ( setuju, tidak setuju) diberikan insentif antara 0 dan 10 (dapat ditransformasikan menjadi log, misal remunerasi). Ada dua orang yang mengajukan penawaran kepada kandidat ("Jill dan Jack"). Model yang sebenarnya adalah bahwa para kandidat memiliki tingkat penerimaan dasar dan yang meningkat dengan meningkatnya insentif. Tetapi itu juga tergantung pada siapa yang mengajukan penawaran (dalam hal ini kita katakan Jill memiliki peluang lebih baik daripada Jack). Asumsikan bahwa gabungan mereka meminta 1000 kandidat dan mengumpulkan data penerimaan (1) atau ditolak (0) mereka.y=1y=0x

require(faraway)
people = c("Jill","Jack")
proposer = sample(people,1000,replace=T)
incentive = runif(1000, min = 0, max =10)
noise = rnorm(1000,sd=2)
# base probability of agreeing is about 12% (ilogit(-2))
agrees = ilogit(-2 + 1*incentive + ifelse(proposer == "Jill", 0 , -0.75) + noise) 
tt = runif(1000)
observedAgrees = ifelse(tt < agrees,1,0)
glm.logit=glm(observedAgrees~incentive+proposer,family=binomial); summary(glm.logit) 

Dari ringkasan Anda dapat melihat bahwa modelnya sangat cocok. Penyimpangannya adalah (std dari adalah ). Yang cocok dan mengalahkan model dengan probabilitas tetap (perbedaan penyimpangan beberapa ratus dengan ). Agak lebih sulit untuk menggambar karena ada dua kovariat di sini tetapi Anda mendapatkan idenya.χn32χ22.dfχ22

xs = coef(glm.logit) %*% rbind(1,incentive,as.factor(proposer))
ys = as.vector(unlist(ilogit(xs)))
plot(ys~ incentive, type="n"); require(faraway); grid()
points(incentive[proposer == "Jill"],ys[proposer == "Jill"],col="red")
points(incentive[proposer == "Jack"],ys[proposer == "Jack"],col="blue")

Jill in Red Jack in Blue

Seperti yang Anda lihat, Jill memiliki waktu yang lebih mudah untuk mendapatkan hit rate yang baik daripada Jack tetapi itu hilang begitu insentif naik.

Anda pada dasarnya harus menerapkan model jenis ini ke data asli Anda. Jika output Anda adalah biner, pertahankan 1/0 jika multinomial, Anda memerlukan regresi logistik multinomial. Jika Anda berpikir sumber tambahan varians bukan pengumpul data, tambahkan faktor lain (atau variabel kontinu) apa pun yang menurut Anda masuk akal untuk data Anda. Data datang lebih dulu, kedua dan ketiga, baru setelah itu model tersebut ikut bermain.


Sebuah komentar oleh OP, "Nilai-nilai y adalah probabilitas berada pada kelas tertentu, yang diperoleh dari rata-rata klasifikasi yang dilakukan secara manual oleh orang-orang," menunjukkan bahwa regresi logistik tidak sesuai untuk data ini - walaupun itu mungkin menjadi solusi yang bagus untuk kelas tersebut. data mentah (seperti yang disarankan dalam paragraf pertama Anda), tergantung pada apa "klasifikasi" dan bagaimana "rata-rata" terjadi. Ketika diterapkan pada data yang diperlihatkan dalam pertanyaan, glmbuat garis tidak rata yang relatif datar yang terlihat sangat seperti garis yang ditunjukkan dalam pertanyaan.
whuber

Terima kasih. Dan ya, y adalah probabilitas. Saya juga memposting data mentah dalam pertanyaan terkait: stats.stackexchange.com/questions/83576/... , meskipun saya menelepon x apa yang saya sebut log (x) dalam pertanyaan lain ...
Timothée HENRY

Saya berharap saya tahu bahwa sebelum saya memperoleh sampel dari gambar Anda, LOL!
whuber

5

Model regresi linier tidak cocok untuk data. Orang mungkin berharap untuk mendapatkan sesuatu seperti berikut dari regresi:

masukkan deskripsi gambar di sini

tetapi dengan menyadari apa yang dilakukan OLS, jelas bahwa ini bukan yang akan Anda dapatkan. Interpretasi grafis dari kuadrat terkecil biasa adalah meminimalkan kuadrat vertikal antara garis (hyperplane) dan data Anda. Jelas garis ungu yang saya tumpang tindih memiliki beberapa residu besar dari dan lagi di sisi lain dari 3. Inilah sebabnya mengapa garis biru lebih cocok daripada ungu.x(7,4.5)


@ pofod Ya, saya mengerti. Jadi saya menghapus komentar saya (saya tahu Anda tahu itu kuadrat; tetapi pembaca lain mungkin tidak).
Peter Flom

1
Regresi yang disensor berbeda dari regresi dengan variabel dependen yang terbatas pada rentang yang diketahui tetap. Data-data ini tidak disensor dan regresi yang disensor akan melakukan apa pun yang berbeda dengan mereka daripada regresi biasa.
whuber

Ya, salahku. Menghapus bagian itu.
pkofod

4

Karena Y dibatasi oleh 0 dan 1, regresi kuadrat terkecil tidak cocok. Anda dapat mencoba regresi beta. Di Rsana ada betaregpaket.

Coba sesuatu seperti ini

install.packages("betareg")
library(betareg)
betamod1 <- betareg(y~x, data = DATASETNAME)

Info lebih lanjut

EDIT: Jika Anda ingin akun lengkap dari regresi beta, kelebihan dan kekurangannya, lihat Pemerasan lemon yang lebih baik: Regresi kemungkinan maksimum dengan variabel dependen terdistribusi beta oleh Smithson dan Verkuilen


4
Model apa yang betaregsebenarnya diimplementasikan? Apa asumsi dan mengapa masuk akal untuk menganggap mereka berlaku untuk data ini?
whuber

2
@whuber Ini pertanyaan yang bagus! Model didefinisikan pada halaman 3 dan 4 sketsa ini . Ini didasarkan pada kepadatan beta yang direparameterisasi dalam hal parameter rata-rata dan presisi (keduanya dapat dimodelkan, masing-masing dengan fungsi tautannya sendiri), dan serangkaian fungsi tautan yang sama dengan yang digunakan untuk model binomial (dan satu lagi). Ini dipasang oleh ML, dan bekerja sangat mirip dengan pemasangan GLM.
Glen_b -Reinstate Monica

2
@whuber Model beta bersyarat biasa digunakan untuk data komposisi dan proporsi atau probabilitas tipe kontinu lainnya. Saya tidak tahu apakah asumsi untuk model seperti itu cocok untuk data ini (saya tidak tahu apa datanya, yang akan menjadi perhatian pertama saya sebelum menyarankan model sendiri), tetapi bahkan hanya dari plot, saya membayangkan bahwa mereka cocok serta model yang disarankan lainnya di sini. Ada sejumlah model dalam jawaban di sini yang tampaknya tidak dibenarkan lebih baik daripada saran Peter, beberapa dengan asumsi (tidak selalu dinyatakan) yang tampaknya lebih sulit dibenarkan.
Glen_b -Reinstate Monica

1
Terima kasih, @Glen_b. Saya tidak menentang saran Peter - hanya mencoba memahaminya, karena saya belum pernah menggunakan beta regression sebelumnya, dan saya membayangkan banyak pembaca di masa depan akan berada dalam situasi yang sama. (Saya cukup akrab dengan model-model lain yang disebutkan dalam utas ini untuk memahami asumsi mereka dan kemungkinan kekurangannya!) Oleh karena itu, akan lebih baik melihat jawaban ini termasuk setidaknya beberapa uraian singkat tentang asumsi dan alasan untuk merekomendasikan solusi ini.
whuber

1
Ah, ya, saya telah menautkan diri pada makalah itu pada jawaban saya sendiri pada satu titik. Smithson (salah satu penulis) memiliki kertas di halaman web-nya . Materi tambahan dihubungkan di sini .
Glen_b -Reinstate Monica

1

Pertama-tama Anda mungkin ingin tahu persis apa yang dilakukan model linear. Mencoba memodelkan hubungan formulir

Yi=a+bXi+ϵi

Dimana ϵimemenuhi kondisi tertentu (heteroskedastisitas, varian seragam, dan independensi - wikipedia adalah awal yang baik jika itu tidak membunyikan lonceng). Tetapi bahkan jika kondisi ini diperiksa, sama sekali tidak ada jaminan bahwa ini akan menjadi "paling cocok" dalam arti yang Anda cari: OLS hanya berusaha untuk meminimalkan kesalahan dalam arah Y, yang merupakan apa yang dilakukannya di Anda kasus, tetapi yang bukan apa yang tampaknya paling cocok.

Jika model linier benar-benar yang Anda cari, Anda dapat mencoba mengubah variabel Anda sedikit sehingga OLS memang dapat dipasang, atau hanya mencoba model lain sama sekali. Anda mungkin ingin melihat ke PCA atau CCA, atau jika Anda benar-benar ingin menggunakan model linier, cobalah solusi kuadrat terkecil total , yang mungkin memberikan "kecocokan" yang lebih baik, karena memungkinkan kesalahan di kedua arah.


Saya pikir saya sedang mencari "Total least square" minimum untuk fungsi linear (a + b * x + epsilon). Saya tersesat.
Timothée HENRY

1
Saya, seperti yang Anda gunakan, meminimalkan jumlah residu kuadrat, yaitu (yabx)2untuk setiap titik data, yang disebut OLS (kuadrat terkecil biasa). Saya tidak dapat menemukan gambar yang bagus untuk OLS linier, tetapi mungkin yang ini masih ilustrasi untuk Anda. OLS meminimalkan kuadrat dari garis hijau, lm melakukan ini dengan garis. Sebagai perbandingan, lihat gambar total kuadrat linear total .
Roland
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.