Здравствуйте.
Требуется сделать курсовую работу по теории вероятности и математической статистике.
Поставил Octave (на лекциях давали MathCad (под Linux вроде тоже есть, но если не ошибаюсь - платный)) и прочитал этот курс статей: http://xgu.ru/wiki/GNU_Octave.
Несмотря на это, застопорился на первом же задании, в котором для выборок надо найти оценки. В MathCad выборка осуществляется с помощью функции rnorm. В Octave её нет.
Что можно прочитать, чтобы все-таки разобраться и сделать эту курсовую? :)
Заранее спасибо.
Octave и мат.статистика
Что-то я не вижу в матлабе функции rnorm. Возможно тебе нужна normrnd, так она есть и в octave.
rnorm (m, m, s) Возвращает вектор m случайных чисел, имеющих нормальное распределение. s > 0.
http://www.nsu.ru/matlab/Exponenta_RU/soft/Mathcad/UsersGuide/list/list.asp.htm
Посмотрел normrnd здесь: http://www.obihiro.ac.jp/~suzukim/masuda/octave/html3/octave_136.html
Вроде бы то, что нужно.
Спасибо за помощь.
в матлабе
Не в матлабе функция, а в маткаде, который нам дают на лекции :)
Да, не заметил.
В любом случае Octave - замена именно Matlab, а не Mathcad.
Насчет этого я в курсе, но на OpenNet было указано, что заменой MathCad является GAP. Но там опять же было несовпадение функций с MathCad, после чего мне посоветовали Octave.
Хм...
Для формирования выборки использовал normrnd, далее, для нахождения выборочного среднего - mean. По идее должно было получиться одно число, т.к., грубо говоря, находим среднее арифмитическое (по формуле).
А вот то, что получилось:
Показать

При этом через MathCad получается все нормально (работа девушки):
http://dl.dropbox.com/u/20415838/%D1%82%D0%B2%D0%B8%D0%BC%D1%81.pdf
http://dl.dropbox.com/u/20415838/%E2%84%966.pdf
Дело в том, что mean считает среднее для вектора, а ты подсунул ему матрицу 100х100, вот он для каждого столбца и подсчитал среднее.
Читай help mean
Чтобы создать вектор, команда должна выглядеть так:
normrnd(m,s,ns,nc)
где
ns - число строк
nc - число стобцов.
Если nc не указывать, то будет создана квадратная матрица ns x ns.
Читай help mean
Читал прилагающуюся к Octave pdf-ку - там про вектор не заметил
Чтобы создать вектор, команда должна выглядеть так:
normrnd(m,s,ns,nc)
где
ns - число строк
nc - число стобцов.
Если nc не указывать, то будет создана квадратная матрица ns x ns.
Была такая догадка, но также была уверенность в том, что я перевел описание неправильно.
Сейчас вызвал таким образом: normrnd(m, s, n, 1); - вроде все нормально.
Благодарю.
Кстати, для мат-статистики вроде люди рекомендуют R. Сам его пока особо не распробовал - не до того было.
R - это язык программирования. Матлаб и Octave - несколько другое. А уж тем более Mathcad
Кстати, для мат-статистики вроде люди рекомендуют R. Сам его пока особо не распробовал - не до того было.
В обозримом будущем мне предстоит сделать курсовик по мат.статистике и в следующем семестре у нас вычислительная математика и вроде как все, поэтому пока не вижу смысла сильно заморачиваться по этому поводу.
Я сейчас не могу понять одного: стало интересно и я посмотрел какие числа заносятся в выборку.
Выборки получаются следующим образом:
X = normrnd(m, s, n, 1);
Y = normrnd(m, s, n, 1);Где m = 0, s = 1, n = 180.
При этом в выборке X вроде как все нормально (на таком объеме проверить сложновато), а выборка Y состоит из 180-ти одинаковых чисел. Я думаю, что все-таки так не должно быть.
В чем ошибка?
Извиняюсь. Была моя ошибка. Случайно нажал не ту кнопку на клаве, в результате чего в цикле выполнялось не вычитание, а присваивание :)
И снова прошу вашей помощи.
Имеется код:
# -------------- [Четвертое задание] --------------
# Для X построить эмпирическую кривую плотности
# распределения, разбив интервал (X(1), X(n)) на 10
# интервалов. На этом же графике изобразить
# теоретическую кривую
function tmp = xb(u, n)
if (u<0)
tmp = 0;
else
tmp = 1/n;
endif
endfunction
function tmp = fb(u, n, X)
temp = 0;
for i = 1:n
temp += xb(u - X(i), n);
endfor
tmp = temp;
endfunction
# Функция для построения эмпирической кривой
# плотности распределения:
function y = fEmp(x, Sx2, Xsr, n, X)
tmp = 0;
for i = 1:9
tmp += (fb(sqrt(Sx2)*0.8*(i-4)+Xsr, n, X) - fb(sqrt(Sx2)*0.8*(i-5)+Xsr, n, X))*(xb(x-(sqrt(Sx2)*0.8*(i-5)+Xsr), n)-xb(x-(sqrt(Sx2)*0.8*(i-4)+Xsr), n))*(n/(0.8*sqrt(Sx2)));
endfor
y = tmp;
endfunction
# Строим эмпирическую кривую плотности распределения:
Xe = 0:1:5;
Ye = fEmp(Xe, Sx2, Xsr, n, X);
# Строим теоретическую кривую плотности распределения:
Yt = normpdf(Xe, Xsr, sqrt(Sx2));
# Прорисовываем график:
plot(Xe, Yt, Xe, Ye)
grid("on")
# -------------------------------------------------
Формулы взяты из учебника. Некоторые переменные были определены выше.
Собственно проблема в том, что график, строящийся функцией normpdf, представляет собой прямую линию, а график, строящийся с помощью самописной функции fEmp вообще не выводится.
К сожалению никак не могу понять в чем проблема.
Заранее спасибо.
P.S. На всякий случай выкладываю полностью скрипт, который есть на данный момент:
Показать
# -------------- [Первое задание] --------------
# Для выборок X, Y найти оценки: выборочное среднее
# выборочная дисперсия, оценка центрального момента
# порядка 3 и 4, коэффициент эксцесса, коэффициент
# ассимитрии, оценка корреляционного момента, оценка
# коэффициента корреляции, размах выборки X и Y
n = 180; # Объем выборки
m = 0; # Коэффициент сдвига
s = 1; # Коэффициент масштаба
a = 0.05; # Уровень значимости
# Формируем выборки с нормальным распределением:
X = normrnd(m, s, n, 1);
Y = normrnd(m, s, n, 1);
# Находим выборочное среднее:
Xsr = mean(X)
Ysr = mean(Y)
# Находим выборочную дисперсию:
Sx2 = 0;
Sy2 = 0;
for i = 1:n
Sx2 += X(i) - Xsr;
Sy2 += Y(i) - Ysr;
endfor
Sx2 /= n - 1
Sy2 /= n - 1
# Находим оценку центрального момента порядка 3 и 4:
M3X = 0;
M3Y = 0;
M4X = 0;
M4Y = 0;
for i = 1:n
M3X += (X(i) - Xsr)^3;
M3Y += (Y(i) - Ysr)^3;
M4X += (X(i) - Xsr)^4;
M4Y += (Y(i) - Ysr)^4;
endfor
M3X /= n - 1
M3Y /= n - 1
M4X /= n - 1
M4Y /= n - 1
# Находим коэффициент эксцесса:
Ex = (M4X / Sx2^2) - 3
Ey = (M4Y / Sy2^2) - 3
# Находим коэффициент ассимитрии:
Sx = M3X / Sx2^(3/2)
Sy = M3Y / Sy2^(3/2)
# Находим оценку корреляционного момента:
Rxy = 0;
for i = 1:n
Rxy += (X(i) - Xsr) * (Y(i) - Ysr);
endfor
Rxy /= n - 1
# Находим оценку коэффициента корреляции:
ro = Rxy / (Sx2^(1/2) * Sy2^(1/2))
# Находим размах выборки:
wX = X(n) - X(1)
wY = Y(n) - Y(1)
# ----------------------------------------------
# -------------- [Второе задание] --------------
# Для оценок по выбоке X построить доверительные
# доверительные интервалы для математического
# ожидания (считая дисперсию известной и
# неизвестной) и дисперсии
# Находим доверительный интервал для математического ожидания
# в случае с известной дисперсией для выборки X:
dims1 = Xsr - ((Sx2^(1/2) / n^(1/2)) * norminv(1-a/2, m, s))
dims2 = Xsr + ((Sx2^(1/2) / n^(1/2)) * norminv(1-a/2, m, s))
# Находим доверительный интервал для математического ожидания
# в случае с неизвестной дисперсией для выборки X:
dimns1 = Xsr - ((Sx2^(1/2) / n^(1/2)) * tinv(1-a/2, n-1))
dimns2 = Xsr + ((Sx2^(1/2) / n^(1/2)) * tinv(1-a/2, n-1))
# Находим доверительный интервал для дисперсии
# для выборки X:
dis1 = (n-1)*Sx2/chi2inv(1-a/2, n-1)
dis2 = (n-1)*Sx2/chi2inv(a/2, n-1)
# ----------------------------------------------
# -------------- [Третье задание] --------------
# По выборкам X, Y построить доверительный интервал
# для коэффициента корреляции
# Определяем доверительный интервал по коэффициенту
# корреляции для выборок X, Y:
z = (1/2)*log((1+Rxy)/(1-Rxy));
z1 = z - tinv(1-a/2, n) * (1/(n-3)^(1/2));
z2 = z + tinv(1-a/2, n) * (1/(n-3)^(1/2));
ro1 = tanh(z1)
ro2 = tanh(z2)
# ----------------------------------------------
# -------------- [Четвертое задание] --------------
# Для X построить эмпирическую кривую плотности
# распределения, разбив интервал (X(1), X(n)) на 10
# интервалов. На этом же графике изобразить
# теоретическую кривую
function tmp = xb(u, n)
if (u<0)
tmp = 0;
else
tmp = 1/n;
endif
endfunction
function tmp = fb(u, n, X)
temp = 0;
for i = 1:n
temp += xb(u - X(i), n);
endfor
tmp = temp;
endfunction
# Функция для построения эмпирической кривой
# плотности распределения:
function y = fEmp(x, Sx2, Xsr, n, X)
tmp = 0;
for i = 1:9
tmp += (fb(sqrt(Sx2)*0.8*(i-4)+Xsr, n, X) - fb(sqrt(Sx2)*0.8*(i-5)+Xsr, n, X))*(xb(x-(sqrt(Sx2)*0.8*(i-5)+Xsr), n)-xb(x-(sqrt(Sx2)*0.8*(i-4)+Xsr), n))*(n/(0.8*sqrt(Sx2)));
endfor
y = tmp;
endfunction
# Строим эмпирическую кривую плотности распределения:
Xe = 0:1:5;
Ye = fEmp(Xe, Sx2, Xsr, n, X);
# Строим теоретическую кривую плотности распределения:
Yt = normpdf(Xe, Xsr, sqrt(Sx2));
# Прорисовываем график:
plot(Xe, Yt, Xe, Ye)
grid("on")
# -------------------------------------------------
# -------------- [Пятое задание] --------------
# ---------------------------------------------
# -------------- [Шестое задание] --------------
# ----------------------------------------------
У тебя Xe = 0:1:5;
это что вообще такое? Если интервалы то их должно быть 10. А если данные для которых надо построить кривую плотности распределения, то конечно у тебя будет горизонтальная прямая с такими исходными данными.
По твоей рукописной функции ни чего не строится, потому что Ye у тебя представляет собой одну точку. Вот она и строится, да и то она нулю равна.
В общем как-то всё плохо у тебя в четвёртом задании.
R - это язык программирования. Матлаб и Octave - несколько другое. А уж тем более Mathcad
Я бы не назвал R именно языком программирования. То есть, конечно, это язык программирования - но по той же логике и matlab - язык программирования.
R - среда для статистических расчётов. Логично, что у неё свой синтаксис и свой язык программирования... Есть и много оболочек для R.
У тебя Xe = 0:1:5;
это что вообще такое? Если интервалы то их должно быть 10. А если данные для которых надо построить кривую плотности распределения, то конечно у тебя будет горизонтальная прямая с такими исходными данными.
А как правильно надо задать? Это данные по координате x для построения графика.
По твоей рукописной функции ни чего не строится, потому что Ye у тебя представляет собой одну точку.
Т.е. я так понимаю определение координаты y надо поставить в цикл? Или можно использовать оператор "." перед вызовом функции?
Если Xe это для построения графика, то зачем ты их используешь для вычисления Ye и Yt? Я так понимаю, что для этого тебе надо использовать изначальный массив случайных величин X или какую-то функцию от него (разбитие на участки или что-то около того).
Я не вникал глубоко в твою функцию, какая-то она монстроузная, так что не могу ответить на второй вопрос.